快捷搜索: 王者荣耀 脱发

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字段无法自增数字。 其实主要原因在于:

  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"`

设置成这样就可以了。

经验分享 程序员 微信小程序 职场和发展