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;