Golang database/sql基础使用方法总结
1,原生用法
写sql语句操作
db.Query可以查询多行;
db.QueryRow查询特定的行。
db.Exec 执行更新插入删除操作
2,Gorm封装用法
Gorm是个go开发人员友好的ORM库,主要包含以下功能点
- 全功能 ORM (无限接近)
- 关联 (Has One, Has Many, Belongs To, Many To Many, 多态)
- 钩子 (在创建/保存/更新/删除/查找之前或之后)
- 预加载
- 事务
- 复合主键
- SQL 生成器
- 数据库自动迁移
- 自定义日志
- 可扩展性, 可基于 GORM 回调编写插件
- 所有功能都被测试覆盖
本文仅简单介绍curd相关操作,更多用法详见官方文档。
0,结构体定义:
列名是字段名的蛇形小写
type User struct {
ID uint // 列名为 `id`
Name string // 列名为 `name`
Birthday time.Time // 列名为 `birthday`
CreatedAt time.Time // 列名为 `created_at`
}
// 重设列名
type Animal struct {
AnimalId int64 `gorm:"column:beast_id"` // 设置列名为`beast_id`
Birthday time.Time `gorm:"column:day_of_the_beast"` // 设置列名为`day_of_the_beast`
Age int64 `gorm:"column:age_of_the_beast"` // 设置列名为`age_of_the_beast`
}
1,查询
此种方法可以多个where拼接,更适合条件变化较多的查询情况
有db.Table(“table_name”)和db.Model(&db_model)两种用法如:
//获取第一个匹配的记录
// SELECT * FROM diversion_card WHERE state = 1 limit 1;
db.Table(“diversion_card").Where(“state = 1").First(&diversion_card)
db.Model(&dcard.Dcard{}).Where(“state = 1").First(&diversion_card)
// 获取所有匹配的记录
// SELECT * FROM diversion_card WHERE state = 1
db.Table(“diversion_card").Where(“state = 1").Find(&diversion_card)
// 非条件,类似于where中的not
db.Table(“diversion_card”).Not(“state = 1").Find(&diversion_card)
//count操作,Count 必须是链式查询的最后一个操作 ,因为它会覆盖前面的 SELECT,但如果里面使用了 count 时不会覆盖
db.Table(“diversion_card").Where(“state = 1").Count(&diversion_card)
//添加offset,limit,order等条件
//SELECT id, state FROM diversion_card WHERE state = 1 limit 1 offset 10 order by ctime desc;
DB.Model(&dcard.Dcard{}).Select(“id,state").Offset(10).Limit(1).Order("ctime DESC”).Where("state =1”).Find(&rows)
查询同时还支持group,having,joins等操作
2,更新
//save更新所有字段,即使你没有赋值
db.First(&user) //先查询出最新的一条,然后更新这个id的数据
user.Name = "jinzhu 2"
user.Age = 100
db.Save(&user)
//更新指定字段用update或updates
DB.Model(&operation.Operation{}).Where("id = ?", v.ID).Updates(data).Error
DB.Model(&operation.Operation{ID:v.ID}).Update(data).Error
//如果你想更新或忽略某些字段,你可以使用 Select(更新指定字段),Omit(忽略忽略字段)
3,插入
DB.Model(&operation.Operation{}).Where("id = ?", v.ID).Create(data).Error
4,删除
db.Where("id =",v.id).Delete(Email{})
5,Error错误处理
在处理数据期间,发生错误很普遍,GORM 提供了一个 API 来将所有发生的错误作为切片返回。但有个错误需要特别注意,即查不到数据的时候:
检查是否返回RecordNotFound错误
db.Where("****").Find(&user).Error
if err == gorm.ErrRecordNotFound {
// do something
}
if err != nil {
// do something
}
6,事务:
// 开始事务
tx := db.Begin()
// 在事务中做一些数据库操作(从这一点使用'tx',而不是'db')
tx.Create(...)
// ...
// 发生错误时回滚事务
tx.Rollback()
// 或提交事务
tx.Commit()