【GORM】GORM jinzhu版本和io版本连接MySQL数据库问题

【GORM】GORM jinzhu版本和io版本连接MySQL数据库问题,第1张

文章目录 前言一、GORM jinzhu版二、GORM.IO版本三、两个版本个别方法对比

前言

众所周知,GORM是一款GO的ORM框架,承担数据持久化工作,在GORM连接数据库中有高低版本的差异,本文给出两个版本的数据库连接方法。

一、GORM jinzhu版
import "github.com/jinzhu/gorm"

db, err := gorm.Open("mysql", "username:password@(localhost)/database?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
	panic(err)
}
defer db.Close()

连接参数解释:

username:用户名
password:密码
localhost:数据库所在主机的IP地址,本地为localhost/127.0.0.1
charset:字符集编码(utf8mb4可以存放表情符号)
parseTime:是查询结果是否自动解析为时间
loc:是MySQL的时区设置。

二、GORM.IO版本
import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

dsn := "root:5120154230@(localhost)/tonghua?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ //建立连接时指定打印info级别的sql
	Logger: logger.Default.LogMode(logger.Info), //配置日志级别,打印出所有的sql
})
if err != nil {
	panic(err)
}
// 新版本中没有Close方法关闭连接,有数据库连接池维护连接信息,也可以利用通用的数据库对象关掉连接
defer func() {
	sqlDB, err1 := db.DB() //获取通用数据库对象
	if err1 != nil {
		panic(err1)
	}
	// SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。
	sqlDB.SetMaxIdleConns(10)
	
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(100)
	
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(time.Hour)
	sqlDB.Close() //常规数据库接口 sql.DB关闭
}()
三、两个版本个别方法对比

1、Open方法

// jinzhu
func Open(dialect string, args ...interface{}) (db *DB, err error) {}

// grom.io
func Open(dialector Dialector, opts ...Option) (db *DB, err error) {}

2、Find方法
gorm.io 的 Find 方法在进行查找时,如果查找结果为空,不会报record not found,当接收函数为集合时,返回空集合;非集合时,返回零值。

// jinzhu
func (s *DB) Find(out interface{}, where ...interface{}) *DB {}

// gorm.io
func (db *DB) Find(dest interface{}, conds ...interface{}) (tx *DB) {}

3、Where方法
jinzhu版在调用 Where 时会创建一个副本,同一个 DB 在多行调用 Where 函数时内容不会叠加

gorm.io版的同一个 DB 在多行调用 Where 函数时内容会叠加

如下例,在执行相同的代码时,两个版本执行的 sql 语句不同

dao.DB.Where("id = 1")
dao.DB.Where("name= ding").Where("age= 25").First(&User)

// jinzhu
// SELECT * FROM `user`  WHERE (name= ding) AND (age= 25) ORDER BY `user`.`id` ASC LIMIT 1

// gorm.io
// SELECT * FROM `user` WHERE id = 1 AND name = ding AND (age = 25) ORDER BY `user`.`id` LIMIT 1
// gormioDao.DB.Statement.Clauses = map[string]clause.Clause{}

看下两个版本的where源码:

// 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
}

参考文章:
1、gorm 版本对比

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/995120.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存