gorm

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
}

https://www.cnblogs.com/weirwei/p/14638037.html


Category golang