参考资料
http://books.studygolang.com/...
https://www.cnblogs.com/MyUni...
https://www.cnblogs.com/qfDav...
https://www.kancloud.cn/kancl...
1. 简介
xorm是一个简单而强大的Go语言ORM
库. 通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL
,我们认为SQL并不会为ORM
所替代,但是ORM将可以解决绝大部分的简单SQL
需求。xorm
支持两种风格的混用。
特性
- 支持
Struct
和数据库表之间的灵活映射,并支持自动同步 - 事务支持
- 同时支持原始
SQL
语句和ORM
操作的混合执行 - 使用连写来简化调用
- 支持使用
ID
,In
,Where
,Limit
,join
,Having
,Table
,SQL
,Cols
等函数和结构体等方式作为条件 - 支持级联加载
Struct
-Schema
支持(仅Postgres
) - 支持缓存
- 通过
xorm.io/reverse
支持根据数据库自动生成xorm
结构体 - 支持记录版本(即乐观锁)
- 通过
xorm.io/builder
内置SQL Builder
支持 - 上下文缓存支持
- 支持日志上下文
驱动支持xorm
当前支持的驱动和数据库如下:
- Mysql5 / Mysql8.* / Mariadb / Tidb
- github.com/go-sql-driver/mysql
- github.com/ziutek/mymysql/godrv
- Postgres / Cockroach
- github.com/lib/pq
- SQLite
- github.com/mattn/go-sqlite3
- MsSql
- github.com/denisenkom/go-mssqldb
- Oracle
- github.com/mattn/go-oci8 (试验性支持)
安装
go get xorm.io/xorm
2.查询
2.1 Cols特定字段查询 Cols
方法可以接受一个或者多个特点的表字段名称,用来表示限定于操作特定的表字段。依然通过案例来说明:
engine.Cols("user_name","status").Find(&admins)
//select user_name, status from admin
上述Cols
操作表示的sql
语句就是注释所对应的sql
语句,表示从admin
表中,查询特定的user_name
, status
两个字段,并将查询后的集合进行返回。
engine.Cols("user_name","status").Update(&admin)
//update admin set user_name = admin.User_name and status = admin.Status
我们可以看到,除了Find
方法外,还可以调用Update
方法,这里即表示更新表结构中的某条数据,且仅仅对该条数据的user_name和status两个字段进行更新,这正是由Cols
方法的参数限定的。AllCols
操作所有字段 除了上述的Cols
指定一个或者多个字段以外,还可以通过AllCols
方法来操作表所有字段,用法与Cols
使用方法一致,我们不再赘述。MustCols
操作限定字段MustCols
意为操作必须对某些字段起作用,该方法的使用和Update
方法相结合的情况较多。
2.2 Get方法
查询单条数据使用Get方法,在调用Get方法时需要传入一个对应结构体的指针,同时结构体中的非空field自动成为查询的条件和前面的方法条件组合在一起查询。
2.3 Find方法
查询多条数据使用Find方法,Find方法的第一个参数为slice的指针或Map指针,即为查询后返回的结果,第二个参数可选,为查询的条件struct的指针。
2.4 Count方法
统计数据使用Count方法,Count方法的参数为struct的指针并且成为查询条件。
user := new(User)
total, err := engine.Where("id >?", 1).Count(user)
2.5 Rows方法
Rows方法和Iterate方法类似,提供逐条执行查询到的记录的方法,不过Rows更加灵活好用。
user := new(User)
rows, err := engine.Where("id >?", 1).Rows(user)
if err != nil {
}
defer rows.Close()
for rows.Next() {
err = rows.Scan(user)
//...
}
2.6 更新时间Updated
Updated可以让您在记录插入或每次记录更新时自动更新数据库中的标记字段为当前时间,需要在xorm标记中使用updated标记,如下所示进行标记,对应的字段必须为time.Time类型。
type User struct {
Id int64
Name string
UpdatedAt time.Time `xorm:"updated"`
}
在Insert(), InsertOne(), Update()方法被调用时,updated标记的字段将会被自动更新为当前时间,如下所示:
var user User
engine.Id(1).Get(&user)
// SELECT * FROM user WHERE id = ?
engine.Id(1).Update(&user)
// UPDATE user SET ..., updaetd_at = ? WHERE id = ?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。