前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gorm 2.0升级笔记

gorm 2.0升级笔记

作者头像
hotqin888
发布2022-01-05 13:59:29
1.9K0
发布2022-01-05 13:59:29
举报
文章被收录于专栏:hotqin888的专栏

一般的就不记录了。

Go gorm是时候升级新版本了 2.0新特性介绍(1) |Go主题月_王中阳的博客-CSDN博客_go2.0

Go GORM是时候升级新版本了 2.0新特性介绍(2)_王中阳的博客-CSDN博客_gorm 升级

第二期Go开源说实录:GORM 剖析与最佳实践_Go中国-CSDN博客

gorm升级V1至V2_CarlosKeFeng的博客-CSDN博客_gorm v2

我用beego 2.0

1. 全局变量问题

原来是这样的

代码语言:javascript
复制
//定义全局的db对象,我们执行数据库操作主要通过他实现。
var _db *gorm.DB

……
看了网上的这样加一个getdb……
 func GetDB() *gorm.DB {
 	return _db
 }
然后到各个方法里先
db:=GetDB()
result:=db.Create(……)

其实2.0直接用这个全局变量即可_db,但是,每个方法里,是否要另外赋值一个新的变量呢,比如:有人说不赋新的变量会影响_db这个全局变量。

代码语言:javascript
复制
db := _db
	projectuser := ProjectUser{ProjectId: pid, UserId: uid}
	result := db.Create(&projectuser) // 通过数据的指针来创建

2. 旧版连接数据库

代码语言:javascript
复制
_db, err = gorm.Open(db_type, dns)

2.0之后的连接数据库,放models下第一个文件的init里

代码语言:javascript
复制
	_db, err = gorm.Open(sqlite.Open(dns), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 使用单数表名,启用该选项后,`User` 表将是`user`
			// NameReplacer:  strings.NewReplacer("CID", "Cid"), // 在转为数据库名称之前,使用NameReplacer更改结构/字段名称。
			// TablePrefix:   "t_",                              // 表名前缀,`User`表为`t_users`
		},
	})

	if err != nil {
		panic("gorm failed to connect database")
	}

3.新建表格问题,以及最麻烦的表格之间有关联关系的话,谁先建立,谁后建立的问题

旧的用createtable,新的没有了,只有下面AutoMigrate又叫迁移,谁能想到它就是建表呢。网上有做什么映射之类的,我觉得太复杂了(主要是我看不懂)。

说到执行顺序,beego是先执行models里的init,然后执行controllers里的init,都是按文件名排序顺序执行。

代码语言:javascript
复制
下面这段代码,放在models里的第一个文件里的init方法里。	
sqlDB, err := _db.DB()
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(100)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(24 * time.Hour)
// 自动建表
	_db.AutoMigrate(&Article{}, &Business{}, &BusinessUser{}, &NickName{}, &BusinessCheckin{}, &Location{}, &LocationNavigate{})

建表出错,主要是建表顺序的问题,因为以前写的建表都是放在各自的models下面,一般情况下问题也不大。就是注意关联表格的建表顺序吧。

4.提示“define a valid foreign key for relations or implement the Valuer/Scanner interface”

位置:结构体里想加入一些额外的字段,作为输出用,而不需要建表,比如嵌入的结构体,所嵌入的是数组就提示这个了。

代码语言:javascript
复制
//模板-输入表
type TempleInputs struct {
	gorm.Model
	UserTempleID      uint
	InputAlias        string            `json:"inputalias" gorm:"column:input_alias"`
	RealMin           string            `json:"realmin"`
	RealMax           string            `json:"realmax"`
	HistoryInputValue HistoryInputValue `json:"historyinputvalue"`
	SelectValue       []Select2         `json:"selectvalue" gorm:"-"` // hasMany 不加 gorm:"-"这个就会提示错误了。因为查询表的时候,是没有这个表存在的
	TextArealValue    TextAreal         `json:"textarealvalue" gorm:"-"`// hasone
}

// 这儿结构体并不需要建表,仅仅是为了前端显示的时候,构造这个数据加入到上面那个结构体中
type Select2 struct {
	ID    uint   `json:"id"`
	Text  string `json:"text"`
	Value string `json:"value"`
}

解决方案,加 gorm:"-"。注意,json和gorm之间用空格隔开,这个困扰我很久。

5.has one/has many/belongs to,它们的foreignKey和references正好相反

当has one/has many的时候

`gorm:"foreignKey:关联表的结构体字段;references:当前表的结构体字段;`

当belongs to 的时候,正好相反

`gorm:"foreignKey:当前表的结构体字段;references:关联表的结构体字段;`

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/01/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档