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.交流群: 2702237 13835667

相關課文
  • GO語言GORM如何更新字段

  • gorm一般查詢與高級查詢

  • GORM時間戳跟蹤及CURD(增刪改查)

  • GORM主鍵、表名、列名的約定

我要說說
網上賓友點評