1

我遇到以下错误:

  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因为我想要一个字符串,而不是一个对象。


我尝试了此处此处的建议,但字符串保持不变。我也尝试替换'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
4

1 回答 1

3

在发送执行之前记录您的 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/了解为什么这很重要。

于 2013-06-04T13:56:50.773 回答