无法使用'where'和变量删除SQLite行

2 投票
1 回答
3988 浏览
提问于 2025-04-18 08:58

我遇到了一个问题,希望能得到一些帮助。

我想删除一行数据,这行数据是通过一个变量传给我的函数的。以下是代码:

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。)

撰写回答