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()