GORM学习小记(Ⅱ)| 青训营

70 阅读2分钟

因为浅学过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字段中。 如果想要填入一个属性为空值,可以考虑采用以下方法:

  1. 使用指针方式实现零值存入数据库:

    将上文的Name改为

Name *string `gorm:"default:'zhangsan'"`

此时数据库中该条记录name字段的值就是'';

  1. 使用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的方法事务性插入数据