两个版本
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{}
api
// 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 }
标签:...,tx,DB,对比,版本,interface,Where,gorm From: https://www.cnblogs.com/beatle-go/p/17455933.html