我遇到以下错误:
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
,因为我想要一个字符串,而不是一个对象。
我尝试了here和here找到的建议,但字符串保持不变。我还尝试将'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
答案 0 :(得分: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/了解其重要性。