从上周觉得在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···不知道有没有大佬知道要怎么搞
其他好像没啥了,想起来、遇到了再补充