无法使用'where'和变量删除SQLite行
我遇到了一个问题,希望能得到一些帮助。
我想删除一行数据,这行数据是通过一个变量传给我的函数的。以下是代码:
con = sql.connect('db.sqlite')
cur = con.cursor()
query = 'delete from media_tmp where media_id="%s"' % media_id.strip()
print(query)
cur.execute(query)
if con:
con.close()
执行 print(query) 后,我得到了以下内容:
delete from media_tmp where media_id="737589711821419460_184456611"
而当我直接在 sqlite 中执行这个查询时,它能正常工作,成功删除了该行数据。可是通过 cur.execute(query) 执行时却完全不行。
这个函数执行完毕没有问题,我没有收到任何错误信息。
1 个回答
5
你可能忘记了要提交更改:
con.commit()
sqlite3命令行工具会自动提交更改,但sqlite3
库则不会。
你应该使用SQL参数,而不是简单地把字符串拼接起来:
query = 'delete from media_tmp where media_id=?'
cur.execute(query, (media_id.strip(),))
引用一下sqlite3
的文档:
通常,你的SQL操作需要使用Python变量中的值。你不应该用Python的字符串操作来拼装你的查询,因为这样做不安全;这会让你的程序容易受到SQL注入攻击(可以看看这个搞笑的例子,了解可能出现的问题:http://xkcd.com/327/)。
相反,你应该使用数据库API的参数替换。在你想使用值的地方放一个
?
作为占位符,然后把值的元组作为第二个参数传给游标的execute()
方法。(其他数据库模块可能会使用不同的占位符,比如%s
或:1
。)