【问题标题】:SQL syntax error with python stringspython字符串的SQL语法错误
【发布时间】:2013-05-30 22:35:07
【问题描述】:

我遇到以下错误:

  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

【问题讨论】:

    标签: python sql syntax sqlite


    【解决方案1】:

    在发送执行之前记录您的 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)
    

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

    【讨论】:

    • 谢谢。请注意:以“正确”的方式进行操作会得到sqlite3.InterfaceError: Error binding parameter 1 - probably unsupported type.,这是通过使用unicode(place.matrix) 将其转换为Unicode 来修复的。
    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 2019-06-12
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2015-05-27
    相关资源
    最近更新 更多