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;