pg.v4 update小结
go-pg是golang实现的postgresql client,项目页:https://github.com/go-pg/pg。
按项目页说明使用Update有3中用法 :
// Update all columns except primary keys.
err := db.Update(&book)
// UPDATE "books" SET title = 'my title', text = 'my text' WHERE id = 1
// Update only column "title".
res, err := db.Model(&book).Set("title = ?title").Where("id = ?id").Update()
// UPDATE "books" SET title = 'my title' WHERE id = 1
// Update only column "title".
res, err := db.Model(&book).Column("title").Update()
// UPDATE "books" SET title = 'my title' WHERE id = 1
定义的结构体:
type Book struct {
TableName string `sql:”?SHARD.book” json:”-”`
Id BigID `sql:”id,pk” json:”id”`
UserId BigID `sql:”user_id” json:”userId”`
DeviceId DeviceID `sql:”device_id” json:”deviceId”`
BookName string `sql:”name” json:”bookName”`
Description string `sql:”description” json:”-”`
BookType int16 `sql:”book_type” json:”bookType”`
...
}
- 在使用第一种方式时,pg会自动将struct中命名为ID或者Id的field当做表的主键。 如果命名不是Id或ID的字段,那么需要在tag中指定主键(红字部分)。
以上条件都没有指定时可以选择使用第二种方式的变形
rs, err := this.shard().Model(&book).Where(“id = ?id”).Update()
其中rs是pg中*types.Result 类型,定义如下:
type Result struct { affected int }
rs.Affected()
即可返回Update()
更新的记录数 一个小坑type ( Test struct { TableName string `sql:”test”` Id int64 `sql:”id,pk”` UserId int64 `sql:”user_id”` Info string `sql:”info, type:json”` } )
pg.v4 更新数据时pk必须不能为空,即使指定了Column.下面这种方式无法更新成功。
_, err = db.Model(&this).Column(“text”).Where(“user_id = ?”, this.UserId).Update() ``` 替代方式: ``` _, err = db.Exec(“UPDATE test SET text= ? WHERE user_id= ?”, this.Info, this.UserId)