简介
Go 标准库提供的数据库接口database/sql
比较底层,使用它来操作数据库非常繁琐,而且容易出错。因而社区开源了不少第三方库,如上一篇文章中的sqlc
工具,还有各式各样的 ORM (Object Relational Mapping,对象关系映射库),如gorm
和xorm
。本文介绍xorm
。xorm
是一个简单但强大的 Go 语言 ORM 库,使用它可以大大简化我们的数据库操作。
快速使用
先安装:
$ go get xorm.io/xorm
由于需要操作具体的数据库(本文中我们使用 MySQL),需要安装对应的驱动:
$ go get github.com/go-sql-driver/mysql
使用:
package main
import (
"log"
"time"
_ "github.com/go-sql-driver/mysql"
"xorm.io/xorm"
)
type User struct {
Id int64
Name string
Salt string
Age int
Passwd string `xorm:"varchar(200)"`
Created time.Time `xorm:"created"`
Updated time.Time `xorm:"updated"`
}
func main() {
engine, err := xorm.NewEngine("mysql", "root:12345@/test?charset=utf8")
if err != nil {
log.Fatal(err)
}
err = engine.Sync2(new(User))
if err != nil {
log.Fatal(err)
}
}
使用xorm
来操作数据库,首先需要使用xorm.NewEngine()
创建一个引擎。该方法的参数与sql.Open()
参数相同。
上面代码中,我们演示了xorm
的一个非常实用的功能,将数据库中的表与对应 Go 代码中的结构体做同步。初始状态下,数据库test
中没有表user
,调用Sync2()
方法会根据User
的结构自动创建一个user
表。执行后,通过describe user
查看表结构:
如果表user
已经存在,Sync()
方法会对比User
结构与表结构的不同,对表做相应的修改。我们给User
结构添加一个Level
字段:
type User struct {
Id int64
Name string
Salt string
Age int
Level int
Passwd string `xorm:"varchar(200)"`
Created time.Time `xorm:"created"`
Updated time.Time `xorm:"updated"`
}
再次执行这个程序后,用describe user
命令查看表结构:
发现表中多了一个level
字段。
**此修改只限于添加字段。**删除表中已有的字段会带来比较大的风险。如果我们User
结构的Salt
字段删除,然后执行程序。出现下面错误:
[xorm] [warn] 2020/05/07 22:44:38.528784 Table user has column salt but struct has not related field
数据库操作
查询&统计
xorm
提供了几个查询和统计方法,Get/Exist/Find/Iterate/Count/Rows/Sum
。下面逐一介绍。
为了代码演示方便,我在user
表中插入了一些数据:
后面的代码为了简单起见,忽略了错误处理,实际使用中不要漏掉!
Get
Get()
方法用于查询单条数据,并使用返回的字段为传入的对象赋值:
type User struct {
Id int64
Name string
Salt string
Age int
Passwd string `xorm:"varchar(200)"`
Created time.Time `xorm:"created"`
Updated time.Time `xorm:"updated"`
}
func main() {
engine, _ := xorm.NewEngine("mysql", "root:12345@/test?charset=utf8")
user1 := &User{}
h