python - SQL 语句中的语法错误:Python 3.6 的更新
问题描述
我正在尝试使用以下命令更新H2 数据库的book表的列键(通过 JayDeBeApi):
sqlCommand = "UPDATE book SET keys = %s WHERE keys IS NULL AND id = %d"
val = (keyWords, idBook)
mydb.execute(sqlCommand, val)
keyWords是字符串类型,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]
我看到问题是由格式类型引起的,但我完全不知道如何解决它。
任何帮助表示赞赏。
解决方案
从文档(实际上是遵守 Python 的PEP 249标准的错误问题)中, JayDeBe API似乎使用 qmarks, , 用于类似于大多数 JDBC 连接的参数占位符。?
因此,您必须在准备好的语句中为所有参数值使用这些占位符,而不按类型(即数字、字符串、日期)进行区分。数据库负责类型转换。
sqlCommand = "UPDATE book SET keys = ? WHERE keys IS NULL AND id = ?"
val = (keyWords, idBook)
mydb.execute(sqlCommand, val)