python - python 字符串的 SQL 语法错误

标签 python sql syntax sqlite

我遇到以下错误:

  File "sqldata/basetables/places.py", line 24, in update
    sqldata.objs.c.execute("UPDATE places SET name='%s', matrix='%s', bans='%s', pop='%s' WHERE name='%s'" % (place.name,place.matrix,place.bans,place.pop,name))
sqlite3.OperationalError: near "bob": syntax error

我有:

>>> place.name
'room'
>>> place.matrix
[['bob', False, False], [False, False, False], [False, False, False]]
>>> place.bans
[]
>>> place.pop
[]
>>> name
'room'

出于某种原因,bob 周围的单引号似乎导致了错误,因为如果我将 'bob' 替换为 True ,它就可以工作,但 room 周围的单引号不会导致任何错误。纠正这个问题的最佳方法是什么?我无法将 'bob' 替换为 bob,因为我想要一个字符串,而不是一个对象。

<小时/>

我尝试了发现的建议 herehere但字符串保持不变。我还尝试将 'bob' 替换为 ''bob''u'''bob'''"bob"“'bob'”“\'bob\'”。这一切都会给出语法错误。

从 SQL 查询中删除单引号会得到:

  File "sqldata/basetables/places.py", line 24, in update
    sqldata.objs.c.execute("UPDATE places SET name=%s, matrix=%s, bans=%s, pop=%s WHERE name=%s" % (place.name,place.matrix,place.bans,place.pop,name))
sqlite3.OperationalError: near ",": syntax error

最佳答案

在发送 SQL 字符串执行之前记录它。根据帖子中的 matrix 值,您会看到结果如下:

UPDATE places SET name='room', matrix='[['bob', False, False], [False, False, False], [False, False, False]]'

现在,显然,'[['bob' 不是一个有效的字符串:您打开一个单引号,然后在左括号后再次将其关闭,但无论如何都继续该字符串。您无法通过更改传入的值来解决此问题:您需要更改 SQL 字符串。

一个(非常糟糕)的解决方案是在 SQL 字符串中使用双引号而不是单引号:然后你会得到:

"""UPDATE places SET name="room", matrix="[['bob', False, False]..."""

这至少是有效的。

但是您不应该这样做。您应该使用 Python DB API 中提供的模板:

"UPDATE places SET name=?, matrix=?, bans=?, pop=? WHERE name=?", (place.name,place.matrix,place.bans,place.pop,name)

这会让数据库驱动程序本身进行插值,并保护您免受 SQL 注入(inject)。请参阅http://bobby-tables.com/为什么这很重要。

关于python - python 字符串的 SQL 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16919392/

相关文章:

python - 使用分页测试 boto3/botocore

python - 通过 Python 从 Impala 访问表

sql - 如何在同一个查询中选择直系子女和祖先

sql - 进行多个左外部排除连接的最佳方法

Python:找不到 libpython3.5.dylib?

python - 如何同时使用 zc.buildout 和 setup.py?

sql - 如何将 SQL Server 数据库中的所有日期时间记录更新为 UTC 时间?

jquery - 如何创建 jQuery 函数(初学者)

syntax - 何时在 clojure require 中包含撇号?

Ruby Object#send 与否定相等