来自 Python 2.7 的 SQLite3 插入不一致

Inconsistent SQLite3 insert from Python 2.7

我在从 Python 向 SQLite3 数据库插入值时遇到问题。以下代码以不同方式插入新行。

m.execute("INSERT INTO transactions VALUES "+str((timestamp,address,recipient_input,amount_input,signature_enc,public_key_readable,openfield_input))+"")

m.execute("INSERT INTO transactions VALUES ('" + str(timestamp) + "','" + str(address) + "','" + str(recipient_input) + "','" + str(amount_input) + "','" + str(signature_enc) + "','" + str(public_key_readable) + "','" +str(openfield_input) + "')")

第二个示例将新行正确插入到 SQLite 数据库中,第一个示例插入“\n”符号。对此有什么解释吗?我想使用第一个使用元组的模型,但不使用“\n”符号替换新行。

如果一个元组包含一个带有换行符的字符串,您只需要查看它是如何打印的就可以看出区别:

>>> print(("foo\nbar",))
('foo\nbar',)
>>> print("foo\nbar")
foo
bar

所以我们看到在一种情况下,字符串将被格式化为“\n”,而在另一种情况下它将有一个换行符。

话虽如此,无论如何这都不太可能是正确的方法。您已经接受了 SQL 注射。你过得更好:

values = (
    timestamp,
    address,
    recipient_input,
    amount_input,
    signature_enc,
    public_key_readable,
    openfield_input,
)
m.execute("INSERT INTO transactions VALUES (?,?,?,?,?,?,?)", values)

str() 根据 Python 语法规则格式化其参数,因此它永远不适合 SQL.

为防止格式化问题(和 SQL 注入攻击),使用参数:

m.execute("INSERT INTO transactions VALUES (?,?,?,?,?,?,?)",
          (timestamp, address, recipient_input, amount_input,
           signature_enc, public_key_readable, openfield_input))