Xorm简介
Xorm 是使用 Go 语言编写的 ORM 库,支持 Mysql 、Postgres、TiDB 等数据库驱动,在 gitea、grafana 等开源项目中均有应用。
Xorm的安装和导入
xorm 旧版本有在 github 上维护过,但是新版本都转移到 gitea 上维护,安装最新版的 xorm 库的命令为:
go get -v xorm.io/xorm
在代码中导入的语句为
import (
"xorm.io/xorm"
// 根据需要匿名导入数据库驱动
_ "github.com/go-sql-driver/mysql"
)
"
如果开启了 go module,在代码文件中导入 xorm 后,可以执行 go mod tidy 自动下载 xorm 库并同步到 go.mod 文件中
基础映射关系
ORM(Object Relational Mapping)的含义就是把代码中的对象映射为数据库(通常时关系型数据库)中的一个表,在 xorm 中基础的代码及数据库的映射关系如下:
// 一个 struct 结构体对应数据库中的一张表
// 结构体中的成员对应数据表中的一个字段
// 结构体成员的标签对应数据表字段的相关属性,如类型、是否允许为空、注释等,如果没有指定标签,则用 xorm 库中规定 Go数据类型及字段类型对应表
type User struct {
Id int64
Name string `xorm:"varchar(25) notnull unique 'usr_name' comment('姓名')"`
}
// xorm中的一个 Engine 数据类型,对应数据库中的一个库,此例中就是 xorm-demo 库
engine, _ := xorm.NewEngine("mysql", "root:passwd@/xorm-demo?charset=utf8")
// 设置日志显示sql查询语句
engine.ShowSQL(true)
// 根据struct定义在数据库中创建相应的表结构
if err = engine.Sync2(new(User)); err != nil {
log.Fatalf("Fail to sync database: %v\n", err)
}
数据模型示例
本文以经典的银行交易为例子,演示 xorm 库在操作数据库时的用途。
数据模型为:
type Account struct {
Id int64
Name string `xorm:"notnull unique"`
Balance decimal.Decimal
CardNumber string `xorm:"index"`
Version int `xorm:"version"`
CreatedAt time.Time `xorm:"created"`
UpdatedAt time.Time `xorm:"updated"`
}
type Card struct {
Number string `xorm:"pk varchar(25) notnull unique 'card_No' comment('银行卡号')"`
ValidFrom time.Time
ValidThru time.Time
}
xorm特殊标签
结构体的成员可以通过xorm的标签来声明一些字段属性,有一些可以“望文生义”,比如 notnull 表示字段不能为空,unique 表示字段的值必须唯一,有一些需要查阅文档,比如 created 代表该字段的值为记录创建的时间,version 表示该字段作为乐观锁,详细情况可以查看文档 Xorm中文文档-Column属性定义
xorm名称映射规则
xorm的默认名称映射规则是把驼峰命名的结构体成员转换为下划线命名的数据库字段,如 CreatedAt 会被映射为 created_at
xorm 中定义了 Mapper 接口,凡是实现了 Mapper 接口方法的结构体都可以作为映射规则,默认的映射规则对应的结构体是 SnakeMapper
映射规则是全局生效的,即所有的表名或所有的字段名都遵从一个映射规则:
// 设置映射规则后,所有表的迁移、查询、插入等操作都会运用该映射规则
colMapper := names.NewPrefixMapper(names.SnakeMapper{}, "card_")
engine.SetColumnMapper(colMapper)
if err = engine.Sync2(new(Card)); err != nil {
log.Fatalf("Fail to sync database: %v\n", err)
}
// 同步后的 card 表
mysql> desc card;
+-----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key

本文介绍Xorm,一个使用Go语言编写的ORM库,适用于Mysql、Postgres等数据库,覆盖gitea、grafana等项目。文章深入解析Xorm的基础映射、数据模型、CRUD操作、事务处理及复杂查询,并提供银行交易示例代码。
最低0.47元/天 解锁文章
741

被折叠的 条评论
为什么被折叠?



