Golang学习日志 ━━ gorm2.0的坑~~

本文档列举了使用GORM库在Go语言中操作数据库时遇到的常见问题及解决方法,包括:字段命名规则、数据库连接关闭、表名复数形式、中文表名乱码以及自增ID设置。强调了字段首字母大写、正确关闭数据库连接、禁用表名复数、关闭大小写转换以及设置自增字段的注意事项。
摘要由CSDN通过智能技术生成

本日志不定期更新。

一、记录增加,但是数据为空

文档原话为:

默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间

其中容易被忽略的是:

如果结构体的属性对应着表里的字段,那么该属性名的首字母必须大写,否则与数据库互动时,该属性(列)将被忽略。
此时可能发生记录虽然新增了,但由于没有对应的列,于是数据都为空。

例如

type User struct {
	gorm.Model
	Username string `gorm:"unique; not null"`
	password string `gorm:"not null;"`
}

利用这个结构体,无论是创建表还是进行其它数据库操作,password都不会作为列参与进来。
因此必须改成如下方式,password才会奏效:

type User struct {
	gorm.Model
	Username string `gorm:"unique; not null"`
	Password string `gorm:"not null;"`
}

注意:表字段实际名称可以全为小写,并不必须首字母大写

参考链接:go语言gorm踩坑笔记

二、无法关闭数据库连接

网上教程用的都是gorm1.0版本,使用defer db.Close()就行了,但现在gorm已经是2.0版,系统会提示方法不存在。
后来网上又找到一些文章说因为有连接池,可以不需要Close()

于是我半信半疑的启动了程序~~~半天后,数据库提示连接过多,崩了。。。打开监视器,发现连接全在,唉。

最终还是找到了办法 常规数据库接口 sql.DB

老版可能是这样写的:

db, err := gorm.Open("...", "... ...")
defer db.Close()

现在需要这样写:

db, err := gorm.Open(..., ...)
defer func() {
	sqlDB, err := db.DB()
	if err != nil {
		...
	}
	sqlDB.Close()
}()

参考链接:
go 通过gorm新建的数据库连接, 何时close呢

三、新建表默认为复数

如何取消表后的s?
很简单,就是加一个单数表名的配置,如下:

db, err := gorm.Open(mysql.New(mysql.Config{
	DSN: dsn,
}), &gorm.Config{
	NamingStrategy: schema.NamingStrategy{
		SingularTable: true, // 禁用表名复数形式,例如User的表名默认是users,
	}
})

但可能会提示undefined: schema
其实是少了开头这句引用

"gorm.io/gorm/schema"

参考链接:
gorm 查询总是将表名转为复数的问题

四、创建中文表名出现乱码

只需要关闭大小写转换即可,具体原因查看参考链接。

db, err := gorm.Open(mysql.New(mysql.Config{
	DSN: dsn,
}), &gorm.Config{
	NamingStrategy: schema.NamingStrategy{
		NoLowerCase:   true, // 关闭大写转小写,这是关键,启动这个就不在会导致中文乱码!
	},
})

参考链接:
解决gorm中文表名或表头报错和乱码问题,gorm中文报错如何解决?

五、创建ID号自增无效

比如常用的:

type tableTest struct {
	ID          int32     `json:"ID" gorm:"column:ID;type:mediumint(7);NOT NULL;DEFAULT:0;comment:'layoutid';AUTO_INCREMENT;primary_key"`
	Pid   string    `json:"pid" gorm:"column:pid;type:char(16);NOT NULL;DEFAULT:'';comment:'项目编号';primary_key"`
	Pname  string    `json:"pname" gorm:"column:pname;type:varchar(50);NOT NULL;DEFAULT:'';comment:'项目名称'"`
	Updatetype int64     `json:"updatetype" gorm:"column:updatetype;type:tinyint(1);NOT NULL;DEFAULT:0;comment:'数据变更类型(1、新增  2、修改  3、删除)'"`
	Updatedate time.Time `json:"updatedate" gorm:"column:updatedate;type:datetime;NOT NULL;comment:'更新时间'"`
}

这么写,ID字段无法自增数字。
其实主要原因在于:

  1. AUTO_INCREMENT属于type参数的值,不能单独拿出来用;
  2. 同时如果设置了自增,那么默认值default:0就不能再使用了。
ID          int32     `json:"ID" gorm:"column:ID;type:mediumint(7) AUTO_INCREMENT;NOT NULL;comment:'layoutid';;primary_key"`

设置成这样就可以了。

在这里插入图片描述

参考链接:
关于gorm的auto_increment无效的问题

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值