gorm使用&踩坑记录

简介: 最近在自己写一个go的项目,在这里记录一下~

从上周觉得在go里边手写db.exec(select * from xxx) 非常痛苦之后,开始使用gorm这个框架,感觉确实很不错,但是可能是由于自己的见识还是不够广阔,导致踩了一些小坑,还留了一些问题··这里先记录一下:

什么是gorm

gorm可以类比到java的mybatsis,非常方便的orm操作框架,可以方便的操作数据库。

怎么使用

官方教程里边讲的已经非常详细了,我大致大致写一下流程

先建立数据库对应的struct,这个可以对应到spring里边的model

type User struct {
  gorm.Model
  Name   string `gorm:"column:name; unique" db:"name" json:"name" form:"name"` 
  Desc   string `gorm:"column:desc" db:"desc" json:"desc" form:"desc"`         
}

这就是个非常普通的model,接下来我们挨个看:

  • 这个struct的名字是user, 可以用db.AutoMigrate(&User{})来检查表和struct是否匹配,如果这个表不存在,就会以struct的名字的复数形式来自动建表,比如这个结构自动建表的表名就是users,当然如果不想用这个表名的话,也可以手动指定其他的表名。
  • gorm.Model是内嵌了一个结构体,这个结构体里边包括id、创建时间、修改时间、删除时间。我们亦可以内嵌其他的结构体进来。
  • 每个属性后边的描述体gorm:"column:name; unique" db:"name" json:"name" form:"name"在gorm这个里边可以指定列名、列是否是主键、是否是索引等····这里没有指定主键是因为grom.Model里边的id为默认主键。

线程池

func getConn() (*gorm.DB, error) {
  dsn := "root:123456@tcp(localhost:3306)/fund?charset=utf8mb4&parseTime=True&loc=Local"
  db, error := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  sqlDB, _ := db.DB()
  // SetMaxIdleConns 设置空闲连接池中连接的最大数量
  sqlDB.SetMaxIdleConns(10)
  // SetMaxOpenConns 设置打开数据库连接的最大数量。
  sqlDB.SetMaxOpenConns(100)
  // SetConnMaxLifetime 设置了连接可复用的最大时间。
  sqlDB.SetConnMaxLifetime(time.Hour)
  return db, error
}

其他的函数直接调用getConn()获取db就可以了。

CRUD Methods

// 新增
user := &User{Name: name, Desc: desc}
db.Debug().Create(user)
//查询
var user_in User
db.Debug().Where(user).First(&user_in)

为啥明明是最重要的却只写了这么点?因为这块网上资料最多似乎没必要看我的···

但是这块我有个问题··先记录一下

// 以id作为冲突键,如果有冲突的话什么都不做
db.Clauses(clause.OnConflict{DoNothing: true}).Create(&user)
// 以其他字段作为主键,如果冲突的话do nothing
db.Clauses(clause.OnConflict{
  Columns:   []clause.Column{{Name: "name"}},DoNothing: true}).Create(&user)

我想要做Upsert,用name来检查冲突,如果有冲突的话do nothing,在上边代码的第二段里边指定了name,可以看生成的sql还是用的是id···不知道有没有大佬知道要怎么搞


其他好像没啥了,想起来、遇到了再补充

相关文章
|
存储 编解码 安全
冥王峡谷安装steamos踩坑记录
记录冥王峡谷安装第三方steamos-holoiso时遇到的一些问题,其它玩家可参考
2302 0
|
6月前
|
SQL 数据库
GORM—查
GORM—查
63 0
|
6月前
|
SQL
GORM—改
GORM—改
37 0
|
6月前
|
SQL 数据库
gorm 教程 一(3)
gorm 教程 一
97 0
|
6月前
|
数据库
gorm 教程 一(2)
gorm 教程 一
81 0
|
6月前
|
SQL 数据库
|
6月前
|
6月前
|
SQL Go 数据库
gorm 教程 一(1)
gorm 教程 一
78 0
|
数据采集 JavaScript API
猿人学对抗赛踩坑记录
猿人学对抗赛踩坑记录
159 0
猿人学对抗赛踩坑记录
|
前端开发 Go API
Day07:GORM快速入门04 查找| 青训营
Day07:GORM快速入门04 查找| 青训营