众所周知,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()
连接参数解释:
二、GORM.IO版本username:用户名
password:密码
localhost:数据库所在主机的IP地址,本地为localhost/127.0.0.1
charset:字符集编码(utf8mb4可以存放表情符号)
parseTime:是查询结果是否自动解析为时间
loc:是MySQL的时区设置。
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 版本对比
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)