gorm的一些用法和特性

144 阅读2分钟
这是我参与「第五届青训营」伴学笔记创作活动的第 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中有两种方式实现preloadjoin 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也支持手动事务可以利用Begin Rollback Commit等函数实现一个手动的事务

安全

众所周知sql会出现sql注入的安全问题gorm的做法是通过占位符?来避免一些sql注入问题,但为支持某些功能gorm仍然会有些情况下会出现sql注入的安全问题,gorm作者写到,避免sql注入的一般原则是,不信任用户提交的数据,所以本人认为可以合理的对用户输入的数据进行校验,或者将某些可能的sql注入加入敏感词行列以达到数据过滤目的

本文参考文档learnku.com/docs/gorm/v…