兩個版本
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
}