因为浅学过Java= =,所以想要联系起来复习看看能不能有什么方便学习的思路,有误请多多指教。
1. 创建记录(插入)
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()} //创建前请定义一个User结构体
db.NewRecord(user) // => 返回 `true` ,因为主键为空
db.Create(&user)
db.NewRecord(user) // => 在 `user` 之后创建返回 `false`
还可以带切片多条连插。
users := []*User{
User{Name: "Jinzhu", Age: 18, Birthday: time.Now()},
User{Name: "Jackson", Age: 19, Birthday: time.Now()},
}
result := db.Create(users) // 切片多条插入
//for _, user := range users {
//user.ID
//} 可以for...range多条插入
result.Error // 返回一个异常
result.RowsAffected //返回插入条数
2.默认值
可以通过 tag 定义字段的默认值,比如:
Name string `gorm:"default:'zhangsan'"`
注意: 通过tag定义字段的默认值,在创建记录时候生成的 SQL 语句会排除没有值或值为 零值 的字段。 在将记录插入到数据库后,Gorm会从数据库加载那些字段的默认值。 如:
var user = User{Name: "", Age: 99}
db.Create(&user)
这里Name为空,所以将"zhangsan"作为默认值填入Name字段中。 如果想要填入一个属性为空值,可以考虑采用以下方法:
-
使用指针方式实现零值存入数据库:
将上文的Name改为
Name *string `gorm:"default:'zhangsan'"`
此时数据库中该条记录name字段的值就是'';
- 使用Scanner/Valuer接口方式实现零值存入数据库:
有一个
NullString结构体
type NullString struct {
String string
Valid bool // 表示该字符串是否是有效的非空值
}
-
String: 用于存储字符串的值。如果Valid字段为false,则String字段的值应该为零值空字符串,否则代表了有效的字符串值。 -
Valid: 用于表示字符串是否是有效的非空值。如果Valid为true,则String字段应该包含有效的字符串值;如果Valid为false,则String字段的值应该是零值空字符串,表示无效的字符串。在以下示例中通过sql.NullString插入空值完成操作:
// 使用 Scanner/Valuer
type User struct {
ID int64
Name sql.NullString `gorm:"default:'zhangsan'"` // sql.NullString 实现了Scanner/Valuer接口
Age int64
}
user := User{Name: sql.NullString{"", true}, Age:18}
db.Create(&user) // 此时数据库中该条记录name字段的值就是''
3. 扩展创建选项
通过Set可以扩展创建时的一些功能,例如:
db.Set("gorm:insert_option", "ON CONFLICT").Create(&user) //冲突时合并插入
db.Set("gorm:setter:transaction", user.Method).Create(&user) //根据user的方法事务性插入数据