首页 > 解决方案 > 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]

我看到问题是由格式类型引起的,但我完全不知道如何解决它。

任何帮助表示赞赏。

标签: pythonsqlspring-booth2

解决方案


从文档(实际上是遵守 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)

推荐阅读