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主鍵、表名、列名的約定

我要說說
網上賓友點評