【问题标题】:Golang postgres Commit unknown command error?Golang postgres 提交未知命令错误?
【发布时间】:2016-04-26 21:52:10
【问题描述】:

使用postgres 9.3go 1.6

我一直在尝试使用 go pq 库的事务。

// 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?),为什么会出现此错误?

我相信this 是造成错误的地方。

【问题讨论】:

  • 您的语句没有返回任何行。试试执行。 Q 是发送到后端进行查询的协议标识符,对于执行它发送 E。
  • 您忽略了来自db.Begin()txn.Query() 的错误返回;其中一个可能有一个错误,可能会在txn.Commit()
  • @DmitriGoldring,谢谢!这样就解决了。

标签: postgresql go pq


【解决方案1】:

首先我同意来自 cmets 的 Dmitri,在这种情况下,您可能应该使用 Exec。

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

Query 返回 2 个参数一个 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 中的一个错误。

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2016-08-18
    • 1970-01-01
    • 2012-04-24
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多