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
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM