2016-03-29 16 views
0

postgres 9.3 Использование, go 1.6Golang postgres Commit неизвестная ошибка команды?

Я пытался использовать транзакции с библиотекой 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 с параметрами, я всегда получаю ошибку unexpected command tag Q от Commit(). Что это за ошибка (что такое Q?) И почему я ее получаю?

Я считаю, что ошибка создается this.

+1

Ваше заявление не возвращает никаких строк. Попробуйте Exec. Q - идентификатор протокола, отправленный на бэкэнд для запроса, для выполнения, который он отправляет E. –

+0

Вы игнорируете ошибку, возвращаемую из 'db.Begin()' и 'txn.Query()'; возможно, одна из них имеет ошибку, которая может пролить некоторый свет на проблему перед 'txn.Commit()' –

+0

@DmitriGoldring, спасибо! Это решило. – Derek

ответ

0

Для начала я согласен с Дмитрием из комментариев, в этом случае вы, вероятно, должны использовать Exec.

Однако после получения этого же вопрос, который я начал копать:

Query возвращает 2 аргумента а Ряды указателя и ошибки. То, что вы всегда должны делать с объекта через Ряды, чтобы закрыть его, когда вы Дон с ним:

// 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.