you are better than you think

pg.v4 update小结

· by thur · Read in about 1 min · (177 Words)
golang 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”`
    ...
}
  1. 在使用第一种方式时,pg会自动将struct中命名为ID或者Id的field当做表的主键。 如果命名不是Id或ID的字段,那么需要在tag中指定主键(红字部分)。
  2. 以上条件都没有指定时可以选择使用第二种方式的变形

    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)
    

Comments