一、什么是gorm
gorm 是一个用于 go 语言的 orm(对象关系映射)库,它提供了一种简单而强大的方式来与数据库进行交互。gorm 支持多种数据库,包括 mysql、postgresql、sqlite、sql server 等,并且提供了丰富的功能,如自动迁移、预加载、事务管理等。
二、特性
- 全功能 orm
- 关联 (has one,has many,belongs to,many to many,多态,单表继承)
- create,save,update,delete,find 中钩子方法
- 支持
preload
、joins
的预加载 - 事务,嵌套事务,save point,rollback to saved point
- context、预编译模式、dryrun 模式
- 批量插入,findinbatches,find/create with map,使用 sql 表达式、context valuer 进行 crud
- sql 构建器,upsert,数据库锁,optimizer/index/comment hint,命名参数,子查询
- 复合主键,索引,约束
- auto migration
- 自定义 logger
- 灵活的可扩展插件 api:database resolver(多数据库,读写分离)、prometheus…
- 每个特性都经过了测试的重重考验
- 开发者友好
三、安装
go get -u gorm.io/gorm go get -u gorm.io/driver/mysql
四、集成
func initmysql() *gorm.db { // 数据源设置 db, err := gorm.open(mysql.new(mysql.config{ dsn: viper.getstring("db.mysql.dsn"), }), &gorm.config{namingstrategy: schema.namingstrategy{ tableprefix: "t_", singulartable: true, }, logger: logger.default.logmode(logger.info), disableforeignkeyconstraintwhenmigrating: true, }, ) if err != nil { panic(err) } sqldb, _ := db.db() sqldb.setmaxopenconns(viper.getint("db.mysql.maxopenconns")) sqldb.setmaxidleconns(viper.getint("db.mysql.maxidleconns")) sqldb.setconnmaxlifetime(time.hour) return db }
五、crud 接口
创建记录
user := user{name: "jinzhu", age: 18, birthday: time.now()} result := db.create(&user) // 通过数据的指针来创建 user.id // 返回插入数据的主键 result.error // 返回 error result.rowsaffected // 返回插入记录的条数
查询
gorm 提供了 first
、take
、last
方法,以便从数据库中检索单个对象。当查询数据库时它添加了 limit 1
条件,且没有找到记录时,它会返回 errrecordnotfound
错误
// 获取第一条记录(主键升序) db.first(&user) // select * from users order by id limit 1; // 获取一条记录,没有指定排序字段 db.take(&user) // select * from users limit 1; // 获取最后一条记录(主键降序) db.last(&user) // select * from users order by id desc limit 1; result := db.first(&user) result.rowsaffected // 返回找到的记录数 result.error // returns error or nil // 检查 errrecordnotfound 错误 errors.is(result.error, gorm.errrecordnotfound)
更新
当使用 update
更新单列时,需要有一些条件,否则将会引起errmissingwhereclause
错误。 当使用 model
方法,并且它有主键值时,主键将会被用于构建条件,例如:
// 根据条件更新 db.model(&user{}).where("active = ?", true).update("name", "hello") // update users set name='hello', updated_at='2013-11-17 21:34:10' where active=true; // user 的 id 是 `111` db.model(&user).update("name", "hello") // update users set name='hello', updated_at='2013-11-17 21:34:10' where id=111; // 根据条件和 model 的值进行更新 db.model(&user).where("active = ?", true).update("name", "hello") // update users set name='hello', updated_at='2013-11-17 21:34:10' where id=111 and active=true;
删除
删除一条记录时,删除对象需要指定主键,例如:
// email 的 id 是 `10` db.delete(&email) // delete from emails where id = 10; // 带额外条件的删除 db.where("name = ?", "jinzhu").delete(&email) // delete from emails where id = 10 and name = "jinzhu";
原生 sql
db.exec("drop table users") db.exec("update orders set shipped_at = ? where id in ?", time.now(), []int64{1, 2, 3}) // exec with sql expression db.exec("update users set money = ? where name = ?", gorm.expr("money * ? + ?", 10000, 1), "jinzhu")
到此这篇关于go集成gorm数据库操作代码的文章就介绍到这了,更多相关go集成gorm数据库内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论