gorm如何创建记录与模型定义需要注意什么

字号+ 编辑: Snake 修订: IT男在阿里 来源: 原创 2023-09-12 我要说两句(0)

gorm创建记录及字段默认值,使用scanner/valuer接口方式实现零值存入数据库。

GORM创建

创建记录

首先定义模型:

type User struct {
ID     int64
Name  string
Age    int64
}

使用NewRecord()查询主键是否存在,主键为空,使用Create()创建记录:

user := User{Name:"qimi", Age:18}
 
db.NewRecord(user) // 主键为空返回`true`
db.Create(&user) // 创建user
db.NewRecord(user) // 创建`user`后返回`false`

默认值

可以通过tag定义字段的默认值,比如:

type User struct {
ID     int64
Name  string `gorm:"default:'小王子'"`
Age    int64
}

注意:通过tag定义字段的默认值,在创建记录时候生成的SQL语句,会排除没有值或值为零的字段。在将记录插入到数据库后,gorm会从数据库加载那些字段的默认值。

举个例子:

var user = User{Age:99, Name:""}
db.Create(&user)

上面代码实际执行的SQL语句是INSERT INTO users("age") values('99'); 排除了零值字段Name,而在数据库中这一条数据会使用设置的默认值小王子 作为Name字段的值。

注意:所有字段的零值,比如0,"",false或者其他零值,都不会保存到数据库内,但会使用他们的默认值。

如果想避免这种情况,可以考虑使用指针或实现Scanner/Valuer接口,比如:

使用指针方式将零值存入数据库:

type User struct {
ID     int64
Name  *string `gorm:"default:'小王子'"`
Age    int64
}
user := User{Name:new(string), Age:18}
db.Create(&user) // 此时数据库中该条记录name字段的值就是''

使用Scanner/Valuer

type User struct {
ID    int64
Name  sql.NullString `gorm:"default:'小王子'"` // sql.NullString实现了Scanner/Values接口
Age   int64
}
user := User{Name:sql.NullString{"",true}, Age:18}
db.Create(&user) // 此时数据库中该条记录name字段的值就是''

扩展创建选项

例如PostgreSQL数据库中可以使用下面的方式实现合并插入,有则更新,无则插入。

// 为Insert语句添加扩展SQL选项
db.Set("gorm:insert_option","ON CONFLICT").Create(&product)
// INSERT INTO products (name, code) VALUES ("name", "code") ON CONFLICT;

 

阅完此文,您的感想如何?
  • 有用

    0

  • 没用

    0

  • 开心

    0

  • 愤怒

    0

  • 可怜

    0

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.交流群: PHP+JS聊天群

相关课文
  • GO语言GORM如何更新字段

  • gorm一般查询与高级查询

  • GORM时间戳跟踪及CURD(增删改查)

  • GORM主键、表名、列名的约定

我要说说
网上宾友点评