本日志不定期更新。
一、记录增加,但是数据为空
文档原话为:
默认情况下,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
字段无法自增数字。
其实主要原因在于:
AUTO_INCREMENT
属于type
参数的值,不能单独拿出来用;- 同时如果设置了自增,那么默认值
default:0
就不能再使用了。
ID int32 `json:"ID" gorm:"column:ID;type:mediumint(7) AUTO_INCREMENT;NOT NULL;comment:'layoutid';;primary_key"`
设置成这样就可以了。