2016-11-04 75 views
0

我有一个问题,从Python插入到SQLite3数据库的值。以下代码以不同方式插入新行。从Python 2.7插入不一致的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”符号替换新行。

回答

1

str()格式根据Python语法规则,它的参数,所以这是从来没有适用于SQL的。

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

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

完美,谢谢! – HCLivess

1

你只需要看看如何,如果它包含一个换行符的字符串看出区别一个元组印:

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

谢谢!我希望我可以选择两个正确的答案 – HCLivess