簡體   English   中英

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM