Fields/FieldsEx字段过滤

  1. Fields 用于指定需要操作的表字段,包括查询字段、写入字段、更新字段等过滤;
  2. FieldsEx 用于例外的字段指定,可用于查询字段、写入字段、更新字段等过滤;
  1. 假如user表有4个字段uid, nickname, passport, password
  2. 查询字段过滤
  3. 写入字段过滤
    1. m := g.Map{
    2. "uid" : 10000,
    3. "nickname" : "John Guo",
    4. "passport" : "john",
    5. "password" : "123456",
    6. }
    7. db.Table(table).Fields("nickname,passport,password").Data(m).Insert()
  1. 假如user表有4个字段uid, nickname, passport, password
  2. 查询字段排除
    1. // SELECT `uid`,`nickname` FROM `user`
    2. db.Table("user").FieldsEx("passport, password").All()
  3. 写入字段排除

Filter字段过滤

使用示例,假如user表有4个字段uid, , passport, password

  1. r, err := db.Table("user").Filter().Data(g.Map{
  2. "id" : 1,
  3. "uid" : 1,
  4. "passport" : "john",
  5. "password" : "123456",
  6. }).Insert()
  7. // INSERT INTO user(uid,passport,password) VALUES(1, "john", "123456")

其中id为不存在的字段,在写入数据时将会被过滤掉,不至于被构造成写入SQL中产生执行错误。

OmitEmpty空值过滤

map/struct 中存在空值如 nil,"",0 时,默认情况下,gdb将会将其当做正常的输入参数,因此这些参数也会被更新到数据表。如以下操作(以map为例,struct同理):

  1. // UPDATE `user` SET `name`='john',update_time=null WHERE `id`=1
  2. db.Table("user").Data(g.Map{
  3. "name" : "john",
  4. "update_time" : nil,
  5. }).Where("id", 1).Update()

针对空值情况,我们可以通过OmitEmpty方法来过滤掉这些空值。例如,以上示例可以修改为:

  1. type User struct {
  2. Passport string `orm:"passport"`
  3. Password string `orm:"password"`
  4. CreateTime string `orm:"create_time"`
  5. UpdateTime string `orm:"update_time"`
  6. }
  7. user := User{
  8. Id : 1,
  9. NickName : "john",
  10. UpdateTime: gtime.Now().String(),
  11. }
  12. db.Table("user").OmitEmpty().Data(user).Insert()
  13. // INSERT INTO `user`(`id`,`nickname`,`update_time`) VALUES(1,'john','2019-10-01 12:00:00')

关于omitempty标签与OmitEmpty方法:

  1. 针对于struct的空值过滤大家会想到omitempty的标签。该标签常用于json转换的空值过滤,也在某一些第三方的ORM库中用作struct到数据表字段的空值过滤,即当属性为空值时不做转换。
  2. omitempty标签与OmitEmpty方法所达到的效果是一样的。在ORM操作中,我们不建议对struct使用omitempty的标签来控制字段的空值过滤,而建议使用OmitEmpty方法来做控制。因为该标签一旦加上之后便绑定到了struct上,没有办法做灵活控制;而通过OmitEmpty方法使得开发者可以选择性地、根据业务场景对struct做空值过滤,操作更加灵活地。

使用示例:

  1. // SELECT * FROM `user` WHERE `passport`='john' LIMIT 1
  2. r, err := db.Table("user").Where(g.Map{
  3. "nickname" : "",
  4. }).OmitEmpty().One()