zoukankan      html  css  js  c++  java
  • 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
    }
    
  • 相关阅读:
    PAT 甲级 1072 Gas Station (30 分)(dijstra)
    python flask框架学习(二)——第一个flask程序
    python flask框架学习(一)——准备工作和环境配置与安装
    【Beats】Filebeat工作原理(十七)
    【Beats】Filebeat介绍及使用(十六)
    Dapper简介
    Sequelize ORM
    StackExchange / Dapper
    TypeORM 简介
    Egg.js 是什么?
  • 原文地址:https://www.cnblogs.com/weirwei/p/14638037.html
Copyright © 2011-2022 走看看