临时Postgres表过早丢失

时间:2019-05-20 09:09:09

标签: postgresql go

我使用一个临时表来保存ID的范围,因此我可以在其他几个查询中使用它们,而不必在每个查询中添加一长串ID。

我正在GO中构建它,这对我来说是新的。创建临时表的工作原理是,成功获取ID并将这些ID添加到临时表中都是成功的。但是当我使用临时表时,出现此错误:

pq: relation "temp_id_table" does not exist

这是我的代码(已编辑:已添加交易):

//create context
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()

// create database connection
psqlInfo := fmt.Sprintf("host=%s port=%s user=%s "+
    "password=%s dbname=%s sslmode=disable",
    c.Database.Host, c.Database.Port, c.Database.User, c.Database.Password, c.Database.DbName)

db, err := sql.Open("postgres", psqlInfo)

err = db.PingContext(ctx)

tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})

// create temporary table to store ids
_, err = tx.ExecContext(ctx, "CREATE TEMPORARY TABLE temp_id_table (id int)")

// fetch all articles of set 
newrows, err := db.QueryContext(ctx, "SELECT id FROM article WHERE setid = $1", SetId)

var tempid int
var ids []interface{}

for newrows.Next() {
    err := newrows.Scan(&tempid)
    ids = append(ids, tempid)
}

// adding found ids to temporary table so we can use it in other queries
var buffer bytes.Buffer
buffer.WriteString("INSERT INTO temp_id_table (id) VALUES ")
for i := 0; i < len(ids); i++ {
    if i>0 {
        buffer.WriteString(",")
    }
    buffer.WriteString("($")
    buffer.WriteString(strconv.Itoa(i+1))
    buffer.WriteString(")")
}
_, err = db.QueryContext(ctx, buffer.String(), ids...)

// fething article codes
currrows, err := db.QueryContext(ctx, "SELECT code FROM article_code WHERE id IN (SELECT id FROM temp_id_table)")

(我简化了代码,并删除了所有错误处理,以使代码更具可读性)

当我将其更改为普通表时,一切正常。我该怎么办?

1 个答案:

答案 0 :(得分:2)

问题是连接池。您不能保证每个查询都使用相同的服务器连接。为此,您可以使用BeginBeginTx进行交易。

保证返回的sql.Tx对象在其生命周期内使用相同的连接。


相关: