菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
96
0

gorm 版本对比

原创
05/13 14:22
阅读数 25956

两个版本

github.com/jinzhu/gorm v1.9.16
gorm.io/gorm v1.21.3

Open

// jinzhu
func Open(dialect string, args ...interface{}) (db *DB, err error) {}

// grom.io
func Open(dialector Dialector, opts ...Option) (db *DB, err error) {}

Find

// jinzhu
func (s *DB) Find(out interface{}, where ...interface{}) *DB {}

// gorm.io
func (db *DB) Find(dest interface{}, conds ...interface{}) (tx *DB) {}

gorm.io 的 Find 函数在进行查找时,如果查找结果为空,不会报record not found,当接收函数为集合时,返回空集合;非集合时,返回零值

Update

Jinzhu 版本支持传参为结构体,但结构体为零值时 sql 不执行

gorm.io 版本必须传两个参数,传结构体用Updates

// jinzhu
func (s *DB) Update(attrs ...interface{}) *DB {
   return s.Updates(toSearchableMap(attrs...), true)
}

// gorm.io
func (db *DB) Update(column string, value interface{}) (tx *DB) {
	tx = db.getInstance()
	tx.Statement.Dest = map[string]interface{}{column: value}
	tx.callbacks.Update().Execute(tx)
	return
}

Where

jinzhu版在调用 Where 时会创建一个副本,同一个 DB 在多行调用 Where 函数时内容不会叠加

gormio版同一个 DB 在多行调用 Where 函数时内容会叠加

如下例,在执行相同的代码时,两个版本执行的 sql 语句不同

dao.DB.Where("id = 1")
dao.DB.Where("username = 1").Where("password = 1").First(&User)

// jinzhu
// SELECT * FROM `user`  WHERE (username = 1) AND (password = 1) ORDER BY `user`.`id` ASC LIMIT 1

// gorm.io
// SELECT * FROM `user` WHERE id = 1 AND username = 1 AND (password = 1) ORDER BY `user`.`id` LIMIT 1
// gormioDao.DB.Statement.Clauses = map[string]clause.Clause{}
// gorm.io
func (db *DB) Where(query interface{}, args ...interface{}) (tx *DB) {
	tx = db.getInstance()
	if conds := tx.Statement.BuildCondition(query, args...); len(conds) > 0 {
		tx.Statement.AddClause(clause.Where{Exprs: conds})
	}
	return
}

// jinzhu
func (s *DB) Where(query interface{}, args ...interface{}) *DB {
  // 这里 s.clone() 创建了一个 DB 副本
   return s.clone().search.Where(query, args...).db
}

发表评论

0/200
96 点赞
0 评论
收藏