2016-06-14 7 views
1

Я использую this driver для связи с psql от Go. Теперь, когда я выдаю запрос на обновление, у меня нет возможности узнать, действительно ли он что-то обновил (он может обновлять 0 строк, если такой идентификатор отсутствует).Как проверить, успешно ли обновлена ​​запись Psql в Go

_, err := Db.Query("UPDATE tags SET name=$1 WHERE id=1", name) 

Я пытался исследовать переменную заблуждается (в том, как документ предполагает для вставки заявления):

if err == sql.ErrNoRows { 
    ... 
} 

Но даже с несуществующим идентификатором, заблуждается по-прежнему нулевой.

Я также попытался использовать QueryRow с возвращающимся пунктом:

id := 0 
err := Db.QueryRow("UPDATE tags SET name=$1 WHERE id=1 RETURNING id", name).Scan(&id) 

Но это одна не может сканировать & идентификатор, когда идентификатор = 1 нет в базе данных.


Итак, каков канонический способ проверить, обновлено ли мое обновление?

+0

Относящиеся/возможно дубликат [MySQL Вставка float32 и Float64 Go] (http://stackoverflow.com/questions/33751165/mysql -insert-float32-и-float64-гоу) – icza

ответ

5

Попробуйте использовать db.Exec() вместо db.Query() для запросов, не возвращающих результаты. Вместо того, чтобы возвращать объект sql.Rows (который не имеет возможности проверить, сколько строк затронуто), он возвращает объект sql.Result, который имеет метод RowsAffected() (int64, error). Это возвращает количество затронутых строк (вставленных, удаленных, обновленных) с помощью любых операций записи в запросе, поданном на вызов Exec().

Обратите внимание, что если ваш запрос не влияет на какие-либо строки напрямую, но делает это только через подзапрос, строки, затронутые подзапросом, не будут учитываться как строки, затронутые для этого вызова метода.

Кроме того, как метод комментарий примечания, это не работает для всех типов база данных, но я точно знаю, что он работает с pq, так как мы используем этот драйвер самого (и с помощью метода RowsAffected()) ,

Справочные ссылки:

 Смежные вопросы

  • Нет связанных вопросов^_^