Синтаксическая ошибка в операторе SQL: ОБНОВЛЕНИЕ для Python 3.6 - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь обновить столбец ключи таблицы book базы данных H2 (через JayDeBeApi), используя эту команду:

sqlCommand = "UPDATE book SET keys = %s WHERE keys IS NULL AND id = %d"
val = (keyWords, idBook)
mydb.execute(sqlCommand, val)

keyWords имеет тип string, а idBook имеет тип int.Таблица имеет больше столбцов (но это релевантные столбцы) и создается с помощью Spring-Boot:

@Id
private Integer id;

@Column(columnDefinition="varchar(5000)")
private String keys;

Но я получаю эту ошибку:

Traceback (most recent call last):
  File "init.py", line 43, in <module>
    sql.execute(sqlCommand, val)
  File "C:\Users\Us\AppData\Local\Programs\Python\Python36-32\lib\site-packages\jaydebeapi\__init__.py", line 498, in execute
    self._prep = self._connection.jconn.prepareStatement(operation)
jpype._jexception.JdbcSQLExceptionPyRaisable: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "UPDATE BOOK SET KEYS = %[*]S WHERE KEYS IS NULL AND ID = %D "; expected "DEFAULT, NOT, EXISTS, INTERSECTS, SELECT, FROM, WITH"; SQL statement:
UPDATE book SET keys = %s WHERE keys IS NULL AND id = %d [42001-197]

Я вижу, чтопроблема вызвана типами форматирования, но я абсолютно не знаю, как это исправить.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 07 февраля 2019

Из документов (на самом деле проблема ошибка для соблюдения PEP 249 стандарта Python), похоже, что JayDeBe API использует qmarks, ?, длязаполнители параметров аналогичны большинству соединений JDBC.

Таким образом, вы должны использовать эти заполнители в подготовленном операторе для всех значений параметров без дифференциации по типам (т. е. число, строка, дата).База данных заботится о преобразовании типов.

sqlCommand = "UPDATE book SET keys = ? WHERE keys IS NULL AND id = ?"
val = (keyWords, idBook)

mydb.execute(sqlCommand, val)
...