关联【Belongs To / Has One / Has Many / Many To Many】
创建user时,不仅会在user表中插入数据,而且会在car表中插入对应的数据!
条件:User表必须有Car的外键【所以不常用(不建议使用物理外建,而是逻辑外键)】
type User struct {
ID int64 `gorm:"column:id"`
Account string `gorm:"column:account"`
Pwd string `gorm:"column:pwd"`
Car Car
}
type Car struct {
ID int64 `gorm:"id"`
Content string `gorm:"content"`
}
Context
GORM 通过 db.WithContext()
方法提供了 Context 支持
注意:db.WithContext()
会新建Statement导致后续无法复用,所以db.WithContext()
必须写在最前面
错误处理
if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
// 处理错误...
}
方法类型
链式方法
只是拼接SQL,不会立即执行
例如:Where
, Select
, Omit
, Joins
, Scopes
, Preload
, Raw
…
Finisher 方法
会立即执行SQL
例如:Create
, First
, Find
, Take
, Save
, Update
, Delete
, Scan
, Row
, Rows
…
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
tx := db.Where("name = ?", "jinzhu") //创建了一个新的 `Statement` 并添加条件
tx.Where("age = ?", 18) /使用链式方法 后续会继续复用 `Statement`
tx.Find(&users) / 使用Finisher方法 后续就不能继续复用 `Statement`(都执行了啊)
Hook钩子
Hook 是在创建、查询、更新、删除等操作之前、之后gorm自动调用的函数,失败会回滚。
事务
常常使用手动事务
// 开始事务
tx := db.Begin()
tx.SavePoint("sp1")
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
tx.Create(...)
tx.RollbackTo("sp1")
// 遇到错误时回滚事务
tx.Rollback()
// 否则,提交事务
tx.Commit()
Logger
常常使用gorm默认日志 并设置日志级别
func Init() {
1.连接数据库
db, err := gorm.Open(mysql.New(mysql.Config{}), &gorm.Config{
Logger: logger.Default.LogMode(logger.Warn),/常常使用gorm默认日志 并设置日志级别
})
也可以自定义日志:
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: logger.Silent, // Log level
Colorful: false, // 禁用彩色打印
},
)
// 全局模式
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{
Logger: newLogger,
})