2015-10-15 25 views
1

見下文。gorp PreUpdate方法更新非自願列

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 

繼續,我執行UPDATE。 UPDATE的

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

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

結果

1,John,0,1444918337049394900 

列DateCreate更新。

當然,我的期望值是

1,John,1444918337049394761,1444918337049394900 

回答

1

這是因爲初始化你user結構的時候,你沒有明確地設置user.DateCreate,從而有效地將其設置爲0。

GORP無法猜測哪些欄意思是更新或不更新,所以它會更新它們。

做你想做什麼,你必須權衡

  1. Get the struct from the ORM之間做出選擇,已設置的好值的字段。這是將執行的另一個select查詢。
  2. Execute a custom query,失去了ORM的便利性
  3. 我猜你可能有另一個struct沒有這個字段的類型。這似乎凌亂,我不建議。
+0

嗨@HectorJ,謝謝你的回覆。 我明白了,我選擇在UPDATE上使用Exec()方法。 如果PreUpdate能夠排除特定列,非常有用。 –