gorp PreUpdate方法更新非自愿列

时间:2015-10-15 15:03:28

标签: go orm gorp

见下文。

type User struct {
    Id         int64  `db:"id" json:"id"`
    Name  string `db:"name" json:"name"`
    DateCreate int64  `db:"date_create"`
    DateUpdate int64  `db:"date_update"`
}

func (u *User) PreInsert(s gorp.SqlExecutor) error {
    u.DateCreate = time.Now().UnixNano()
    u.DateUpdate = u.DateCreate
    return nil
}

func (u *User) PreUpdate(s gorp.SqlExecutor) error {
    u.DateUpdate = time.Now().UnixNano()
    return nil
}

我执行了INSERT。

user := model.User{
    Name:      "John",
}

err := dbMap.Insert(&user)

INSERT的结果。没问题

1,John,1444918337049394761,1444918337049394761

继续,我执行了更新。

user := model.User{
    Id:        1,
    Name:      "John",
}

_, err := dbMap.Update(&user)

更新结果

1,John,0,1444918337049394900

列DateCreate已更新。

当然,我的期望值是

1,John,1444918337049394761,1444918337049394900

1 个答案:

答案 0 :(得分:1)

这是因为在初始化user结构时,您没有明确设置user.DateCreate,这有效地将其设置为0.

gorp无法猜测您要更新的字段,因此会更新所有字段。

要做你想做的事,你必须在权衡之间做出选择

  1. Get the struct from the ORM,字段已设置为良好值。这是将要执行的另一个select查询。
  2. Execute a custom query,失去了ORM的便利性
  3. 我猜你没有这个字段可以有另一个struct类型。这看起来很乱,我不推荐。