Golang postgres提交时出现未知命令错误?

5

使用 postgres 9.3go 1.6

我一直在尝试使用 gopq 库进行事务处理。

// Good
txn, _ := db.Begin()
txn.Query("UPDATE t_name SET a = 1")
err := txn.Commit() // err is nil

// Bad
txn, _ := db.Begin()
txn.Query("UPDATE t_name SET a = $1", 1)
err := txn.Commit() // Gives me a "unexpected command tag Q" error
// although the data is committed

由于某种原因,当我执行带参数的Query时,总是从Commit()收到一个“unexpected command tag Q”的错误。这个错误是什么意思(Q代表什么?)以及为什么会出现这个错误?
我认为这里是错误发生的地方。

1
您的语句未返回任何行。请尝试使用Exec。Q是发送到后端用于查询的协议标识符,对于执行它发送E。 - Dmitri Goldring
您正在忽略db.Begin()txn.Query()的错误返回;在txn.Commit()之前,这两者中的一个可能存在错误,可能会为问题提供一些线索。 - John Weldon
@DmitriGoldring,谢谢!问题已解决。 - Derek
1个回答

10

首先我同意评论区的Dmitri说法,在这种情况下,你应该使用Exec。

然而,在收到同样的问题后,我开始深入挖掘:

Query返回两个参数:一个Rows指针和一个错误。当你完成对Rows对象的操作时,你必须关闭它:

// Fixed
txn, _ := db.Begin()
rows, _ := txn.Query("UPDATE t_name SET a = $1", 1)
//Read out rows
rows.Close() //<- This will solve the error
err := txn.Commit()

然而,当我使用 rows.Close() 时,并未看到数据库流量上的任何差异,这让我觉得这可能是 pq 中的一个 bug。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接