GORM进阶

关联【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,
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值