you are better than you think

备忘

last update:

type User struct{
TableName string `sql:"user_?SHARD"`
...
}

postgres中user表按uid进行sharding存储。这样会有16张表user_0到user_f。pg.v4 中关于事务可以使用 方法一和方法二

方法一

err := getDB().RunInTransaction(func(tx *pg.Tx) error {
    q := fmt.Sprintf("INSERT INTO user_%s (id,x,x,x) VALUES(default,y,y,y) RETURNING *",shard_str)
    _, err := this.shard().QueryOne(this,q,this)
    return err
})

golang pg.v4的Select,返回结果有可能是0行 1行或者多行,如果根据返回的行数进行下一步的insert 或update,应该怎么做?   如果使用

b:= &[]Book{}
err:= db.Model(b).Where("blabla").Select()

除非是数据库连接异常才会抛出error,而

b:= &Book{}
err:= db.Model(b).Where("blabla").Select()

会在select没有结果时抛出pg.ErrNoRows ,有多行时抛出pg.ErrMultiRows,1行时返回nil,数据库异常时error。 看下源码实现:

db.go

func (db *DB) Model(model interface{}) *orm.Query {
    return orm.NewQuery(db, model)
}