首页 > 其他分享 >gorm 版本对比

gorm 版本对比

时间:2023-06-04 17:23:04浏览次数:40  
标签:... tx DB 对比 版本 interface Where 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{}

 

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

相关文章

  • Slik-Subversion使用命令行或者Ant获得本地svn的版本号码
    使用命令行Subversion访问项目源文件[url]https://www.open.collab.net/nonav/scdocs/ddUsingSVN_command-line.html.zh-cn[/url]Slik-Subversion安装包地址[url]https://sliksvn.com/pub/[/url]1.安装Slik-Subversion-1.7.19-x64.msi[url]https://sli......
  • PECMD 是一种管理和调试 Windows PE 系统的命令行工具,主要用于在 WinPE 环境下进行系
    PECMD是一种管理和调试WindowsPE系统的命令行工具,主要用于在WinPE环境下进行系统管理、修复和救援等操作。根据资料记录,PECMD已经发布了如下版本:PECMD2003:发布于2003年,适用于WindowsPE1.0版本。PECMD2005:发布于2005年,适用于WindowsPE2.0版本,新增支持更......
  • Linux服务器管理系统wdcp v2.5.7版本发布
    wdcp(WDlinuxControlPanel)是一套用PHP开发的Linux服务器管理系统,旨在易于使用和管理Linux服务器,通过web页面操作就可以管理服务器和虚拟主机.简单,方便,易操作.只有Linux版本,没有windows版本,让你方便地使用和管理Linux服务器,让不懂Linux的人也可以用Linux做服务器了.支......
  • 接口管理如何做?接口实现版本管理的意义和最佳方法
    api版本管理的重要性不言而喻,对于API的设计者和使用者而言,版本管理都有着非常重要的意义。下面会从WEBAPI版本管理的角度提供几种常见办法:首先,对于API的设计和实现者而言,需要考虑向后兼容性,但是随着业务的发展或需求的变更往往会导致兼容性实现非常复杂,因此引入API版本管理将能......
  • Flex+J2EE实例(cairngorm+blazeDS+hibernate+spring) part4 (完)
     Flex+J2EE实例(cairngorm+blazeDS+hibernate+spring)part4----addcairngorm1.添加在libs下添加Cairngorm.swc,此时,具备了cairngorm框架能力2.运用cairngorm框架2.1在flex_src下创建如下文件夹和文件   AdminVO.aspackagevo.AdminVO{ [Bindable] publicclassAdm......
  • Flex+J2EE实例(cairngorm+blazeDS+hibernate+spring) part3
    Flex+J2EE实例(cairngorm+blazeDS+hibernate+spring)part3                                   ----addspring &hibernate1.在WEB-INF\lib下添加spring、hibernate常用jar,包括mysql数据库的连接驱动  2.在mysql数据库中创建数据库......
  • 案例补充:简易版本的注册功能
    案例补充:简易版本的注册功能#注册登录1.简易版本的注册功能 #把用户的用户名和密码保存到我们的数据文件中要求:'kevin|123'把用户的用户名和密码组织成你自己喜欢的格式保存到文件中#1.接收用户名和密码username=input('username>>>......
  • 案例补充:进阶版本的多用户注册等了功能
    案例补充:进阶版本的多用户注册等了功能1.支持多用户注册'''快捷键:tab缩进,shift+tab反向缩进''''''多用户注册'''whileTrue:#1.接收用户名和密码username=input('username>>>:')password=input('passwor......
  • LIux操作系统及Liux的发行版本
    一:概述    Liux操作系统是复杂的,它由Liux内核、程序库和用户程序接口组成。系统的底层由硬件和Liux内核进行交互的,用户程序接口通过调用程序库来请求内核服务。初学者肯定对其中的一些名词不太理解。下面对这些名词进行介绍。Liux内核:这是Liux系统的核心,它提供OS最基本的功......
  • Gorm - 链式执行输出执行的SQL【gorm io版本】
    在GROM使用链式操作过程中,我们想要知道最终执行的SQL是什么,本文讲解三种常见的SQL日志打印方法。一、全局打印所有的SQL在gorm.io版本中,我们可以在建立连接时指定打印info级别的sql。import("time""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/go......