SQLite 数据库不会使用 Python 变量进行更新

Posted

技术标签:

【中文标题】SQLite 数据库不会使用 Python 变量进行更新【英文标题】:SQLite database wont update with a Python variable 【发布时间】:2020-03-31 07:02:52 【问题描述】:

我尝试使用以下代码行在 SQLite 数据库的表中更新(添加)名为“product_qty”的单元格的整数值

x = int(TOPUPQTY.get())
cursor.execute("UPDATE 'product' SET product_qty = product_qty + x WHERE `product_name` LIKE ?", ('%'+str(TOPUPPRODUCT_NAME.get())+'%',))

我收到了sqlite3.OperationalError: no such column: x。 但是当我尝试用常量30 替换变量x 时,即:

cursor.execute("UPDATE 'product' SET product_qty = product_qty + 30 WHERE `product_name` LIKE ?", ('%'+str(TOPUPPRODUCT_NAME.get())+'%',))

这很好用,但我需要使用变量而不是常量。

【问题讨论】:

请将您的代码与文本分开。这使它更具可读性。 【参考方案1】:

您在 double-quotes 中编写了变量 x ,当游标语句执行时,它会尝试在表中查找列 x ,这就是为什么会发生错误。

您必须使用占位符将变量的值传递给查询。

【讨论】:

【参考方案2】:

添加占位符“?”对于字符串中的变量。

x = 30
cursor.execute(f"UPDATE product SET product_qty = product_qty + ? WHERE product_name LIKE ?", (x, '%'+str(TOPUPPRODUCT_NAME.get())+'%',))

您不应该自己将 x 放入字符串中,例如使用格式化字符串,如果 x 的内容来自不受信任的来源,那么您就有可能获得 sql 注入。所以最好始终依赖于 sqlite 包本身的格式。

【讨论】:

这就是要走的路。我建议了一个字符串格式的答案,因为我不确定占位符是否可以在这里工作,但我检查了它,一切都很好。

以上是关于SQLite 数据库不会使用 Python 变量进行更新的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python3 创建一个 sqlite 表

如果表是变量(python),如何从 SQLite 表中选择

在 SQLite3 DELETE 语句中引用 python 变量

如何进sqlite数据库命令行

python 操作sqlite数据库

如何使用我的 Python3 fbs 包打包 Sqlite3 数据库?