簡體   English   中英

如何將列表中的數據插入到 SQLite3 數據庫中

[英]How to insert data from a list to SQLite3 Database

這是下面從 qwidgets 導入的數據的列表。

list = ['2020/02/21', 'name', 'location', 'item1', 'item2', 'item3', 'item4', 'item5']

或者

list = ['2020/02/21', 'name', 'location', 'item1']

或者

list = ['2020/02/21', 'name', 'location', 'item1', 'item2', 'item3']

如何將此列表數據插入到 SQLite3 數據庫中。 我正在使用以下數據庫結構。

conn = sqlite3.connect('test.db')
conn.execute("INSERT INTO \
    maintable(date,name,location,item1,item2,item3,item4,item5,item6, item7,item8, item9, item10) \
    VALUES ('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}')

您永遠不應該通過將參數值添加到查詢字符串來構建請求。 我曾經是舊SQL 注入攻擊的載體,它允許攻擊者通過簡單地偽造參數值來傳遞任意 SQL 命令。

推薦的方法是使用參數化查詢。

在這里你應該簡單地做:

conn.execute("INSERT INTO \
    maintable(date,name,location,item1,item2,item3,item4,item5,item6, item7,item8, item9, item10) \
    VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", lst + [None] * (13 - len(lst)))

順便說一句,我重命名了您的列表變量lst以避免隱藏內置list功能。

在您想要使用值來防止 SQL 注入攻擊的任何地方使用占位符 (?) 更好、更安全。

由於列表的大小可能會有所不同,因此您需要動態構建它。 你可以這樣做:

l = ['2020/02/21', 'name', 'location', 'item1', 'item2',...]
query = "INSERT INTO maintable(date,name,location"

for i in range(len(l) - 3):
    query += ',item{}'.format(i+1)

query += ") VALUES (?, ?, ?"

for i in range(len(l) - 3):
    query += ', ?'.format(i+1)
query += ')'

conn.execute(query, l)

確保為占位符提供所有值,並記住提交並關閉連接以保存更改:

conn.commit()
conn.close()

暫無
暫無

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

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