这是我参与「第五届青训营」伴学笔记创作活动的第 3 天
gorm v2的一些特性
1.gorm v2提供了Context的支持
2.可以批量插入用于批量创建数据如下例子可以通过将数据存入slice再通过Create批量创建数据
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name:"jinzhu3"}}
db.Create(&users)
for _, user := range users { user.ID }// 1,2,3
3.支持预编译gorm中有两种方式实现preload和join preload,其中join preload适用于 has one和belongs to,clause.Associations 也可以和 Preload 一起使用,它可以用来 预加载 全部关联,preload也支持嵌套和条件加载clause.Associations 不会预加载嵌套的关联,但你可以使用嵌套预加载
db.Preload("Orders.OrderItems.Product").Preload(clause.Associations).Find(&users)
db.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users) 4.提供
Association方法实现关联,可以实现关联的添加,删除,替换,清空以及查找关联的记录
gorm的CRUD
gorm实现了数据的创建create查询find更新update和删除delete接口
gorm还可以通过Raw或者exec实现原生sql的构建例如:
var result Result
db.Raw("SELECT id, name, age FROM users WHERE id = ?", 3).Scan(&result)
db.Exec("update users set money=? where name = ?", gorm.Expr("money * ? + ?", 10000, 1), "jinzhu")
事务
1.提升30%+性能的方法,如果不在事务中执行写入操作可以禁用默认事务在config写入如下配置:
SkipDefaultTransaction: true 2.gorm还支持嵌套事务可以在一个事务中嵌套一个事务,可以实现事务的自动回滚和提交 db.Transaction(func(tx *gorm.DB) error {
tx.Transaction(func(tx2 *gorm.DB) error {
}) }) 3.gorm也支持手动事务可以利用
BeginRollbackCommit等函数实现一个手动的事务
安全
众所周知sql会出现sql注入的安全问题gorm的做法是通过占位符?来避免一些sql注入问题,但为支持某些功能gorm仍然会有些情况下会出现sql注入的安全问题,gorm作者写到,避免sql注入的一般原则是,不信任用户提交的数据,所以本人认为可以合理的对用户输入的数据进行校验,或者将某些可能的sql注入加入敏感词行列以达到数据过滤目的
本文参考文档learnku.com/docs/gorm/v…