Golang学习日志 ━━ gorm2.0的坑~~
本日志不定期更新。
一、记录增加,但是数据为空
文档原话为:
默认情况下,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;"` }
注意:表字段实际名称可以全为小写,并不必须首字母大写
二、无法关闭数据库连接
网上教程用的都是gorm1.0版本,使用defer db.Close()就行了,但现在gorm已经是2.0版,系统会提示方法不存在。 后来网上又找到一些文章说因为有连接池,可以不需要Close()。
于是我半信半疑的启动了程序~~~半天后,数据库提示连接过多,崩了。。。打开监视器,发现连接全在,唉。
最终还是找到了办法
老版可能是这样写的:
db, err := gorm.Open("...", "... ...") defer db.Close()
现在需要这样写:
db, err := gorm.Open(..., ...) defer func() { sqlDB, err := db.DB() if err != nil { ... } sqlDB.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"
四、创建中文表名出现乱码
db, err := gorm.Open(mysql.New(mysql.Config{ DSN: dsn, }), &gorm.Config{ NamingStrategy: schema.NamingStrategy{ NoLowerCase: true, // 关闭大写转小写,这是关键,启动这个就不在会导致中文乱码! }, })
五、创建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"`
设置成这样就可以了。