Ошибка MySQL в Go - PullRequest
       13

Ошибка MySQL в Go

0 голосов
/ 28 августа 2018

Этот код работает:

stmt, err := db.Prepare("UPDATE `test` SET `score` = ? WHERE id = ?")
CheckErr(err)
_, err = stmt.Exec(value, id)

Но когда я меняю свой код, он не работает:

stmt, err := db.Prepare("UPDATE `test` SET ? = ? WHERE id = ?")
CheckErr(err)
_, err = stmt.Exec("score", value, id)

В чем проблема?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Что бы там ни было, параметры могут использоваться только для литеральных констант внутри запроса. Обычно это значения сравнения в предложении where, иногда константы в предложениях select или set - и реже в других частях запроса.

Идентификаторы не являются буквальными константами. На самом деле, ни одно из следующего:

  • имена баз данных, таблиц и столбцов
  • имена функций
  • операторы (например, +)
  • ключевых слов (например, asc / desc в order by)

К сожалению, чтобы реализовать их «динамически», вам нужно изменить строку запроса, непосредственно изменив строку. Это довольно отвратительно, но альтернативы нет.

Одним из преимуществ этого подхода является то, что он позволяет базе данных сохранять, а затем повторно использовать план запроса. Исключение фазы компиляции может быть важным приростом производительности для очень быстрых запросов.

EDIT:

Я действительно не знаю, иди, но идея такова:

sql := "UPDATE `test` SET [col] = ? WHERE id = ?"

sql = strings.replace(sql, "[col]", "score")

stmt, err := db.Prepare(sql)
CheckErr(err)
_, err = stmt.Exec(value, id)

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

0 голосов
/ 28 августа 2018

Необходимо указать имя столбца в операторе обновления базы данных. без имени столбца в заданной строке запроса на обновление он не будет подготовлен.

...