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

dig*_*ice 2 python sqlite variables sql-delete

遇到问题,将不胜感激任何帮助。

我想删除一行,该行从变量转移到我的 func。那是代码:

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()
Run Code Online (Sandbox Code Playgroud)

打印(查询)给了我以下内容:

delete from media_tmp where media_id="737589711821419460_184456611"
Run Code Online (Sandbox Code Playgroud)

当我直接在 sqlite 中执行它时,它可以完美运行并删除应得的行。但由 cur.execute(query) 执行根本不起作用。

func 完成得很好,我没有错误。

Mar*_*ers 5

您可能忘记提交更改:

con.commit()
Run Code Online (Sandbox Code Playgroud)

sqlite3 命令行工具会自动提交更改,而sqlite3库不会。

您应该真正使用 SQL 参数而不是字符串插值:

query = 'delete from media_tmp where media_id=?'
cur.execute(query, (media_id.strip(),))
Run Code Online (Sandbox Code Playgroud)

引用sqlite3文档

通常,您的 SQL 操作需要使用 Python 变量中的值。你不应该使用 Python 的字符串操作来组合你的查询,因为这样做是不安全的;它使您的程序容易受到 SQL 注入攻击(有关可能出错的幽默示例,请参见http://xkcd.com/327/)。

相反,使用 DB-API 的参数替换。?在任何要使用值的地方作为占位符放置,然后提供一个值元组作为游标execute()方法的第二个参数。(其他数据库模块可能使用不同的占位符,例如%s:1。)