xorm 是一个用Go 语言编写的简单而强大的ORM (对象关系映射) 库。它允许开发者用Go 语言的结构体来操作数据库,而无需直接编写SQL 语句,从而简化了数据库操作。xorm 可以将数据库表映射到Go 语言的结构体,并提供了一系列方便的方法来执行常见的数据库操作,如创建、读取、更新和删除(CRUD) 等。支持多种数据库。
项目地址:https://github.com/go-xorm/xorm
安装xorm
安装
|
|
安装具体数据库的驱动(以MySQL为例)
|
|
demo:
|
|
创建引擎
使用xorm
来操作数据库,需要先用xorm.NewEngine()
创建一个引擎,或者使用xorm.NewEngineGroup()
创建引擎组。Engine Group是xorm的主从读写分离解决方案,主要配置内容为主库和从库的配置,以及从库的负载策略。
|
|
创建完成 EngineGroup 之后,并没有立即连接数据库,此时可以通过 eg.Ping()
来进行数据库的连接测试是否可以连接到数据库,该方法会依次调用引擎组中每个Engine的Ping方法。另外对于某些数据库有连接超时设置的,可以通过起一个定期Ping的Go程来保持连接鲜活。EngineGroup 可以通过 eg.Close()
来手动关闭,但是一般情况下可以不用关闭,在程序退出时会自动关闭。
创建表
- 创建结构体
|
|
字段格式:
- 字段名:默认使用结构体字段名(驼峰式会自动转为下划线式,如
UserName
→user_name
)。 - 数据类型:Go 类型决定数据库类型(如
int
→INT
,string
→VARCHAR
)。 - 标签(Tag):通过
`xorm:"..."`
定义列属性。【可选】
关键字pk
说明:是否是主键,如果有多个字段都使用了此标记,则为复合主键
关键字autoincr
说明:是否是自增,主键如果被设置为自动递增,插入的时候可以省略主键
- 创建表
|
|
初始状态下,数据库test
中没有表users
,调用Sync2()
方法会根据User
的结构自动创建一个users
表。执行后,通过desc users
查看表结构:
建表也可以用Sync
方法,Sync2
已经弃用,Sync
不会对已有表结构的字段进行任何的更改、删除操作,而只会进行增加字段操作。如果表users
已经存在,Sync()
方法会对比User
结构与表结构的不同,对表做相应的修改。这个修改操作只局限于添加字段操作。
增删改查
- 插入数据:使用
engine.Insert(&user)
,可以插入单条数据或者批量插入多条数据。
|
|
Insert传入切片时,数据分成多条SQL进行插入,如果其中一条插入时出错,可能造成后续数据不能继续插入。 Insert传入切片指针时,数据会拼接为一条SQl执行能够插入,由于各数据库SQL长度限制,需要注意不要使用太长的切片内容。如果数据量太大,需要分片进行插入。官方建议每条长度不要超过150。
- 查询数据:查询主要使用
Get
和Find
方法,Get
查找一个结果,Find
则为多个结果,结果会保存的出入参数中。
|
|
查询参数:
Where("a = ? AND b = ?", 1, 2)
: where 条件Alias("o").Where("o.name = ?", name)
: 表别名.Where(...).And(...)
: AND.Asc("id")
.Desc("time")
OrderBy(string)
:结果排序,可以组合使用.ID(1)
:查询主键Or(interface{}, …interface{})
: OR条件Select(string)
:Select内容SQL(string, …interface{})
:SQL内容.In("cloumn", 1, 2, 3)
: IN.Distinct("age", "department")
: 归类去重Table(nameOrStructPtr interface{})
:传入表名称或者结构体指针,如果传入的是结构体指针,则按照IMapper的规则提取出表名Limit(int, …int)
:限制获取的数目,第一个参数为条数,第二个参数表示开始位置,如果不传则为0GroupBy(string)
Count
: 统计数据数量Exist
: 判断某个记录是否存在,比Get,Exist性能更好Sum
:求和数据可以使用Sum
,SumInt
,Sums
和SumsInt
四个方法
- 修改数据:通过
engine.Update()
实现,可以传入结构指针或map[string]interface{}
。对于传入结构体指针的情况,xorm只会更新非空的字段。如果一定要更新空字段,需要使用Cols()
方法显示指定更新的列。使用Cols()
方法指定列后,即使字段为空也会更新
|
|
- 删除数据
软删除:逻辑删除,记录留在表里;如果表中有
deleted_at
或类似的软删除字段,可以配置软删除:engine.ID(1).Delete(&Users{})
,执行删除实际上是更新deleted_at
字段,标记删除时间。
|
|
真正删除:无视软删除,engine.ID(1).Unscoped().Delete(&Users{})
xorm vs gorm
gorm 和 xorm 都是 Go 语言中流行的 ORM(对象关系映射)框架,它们可以帮助开发者更高效地与数据库交互,功能类似。xorm更接近原生sql。
参考: