使用 Python 字典向 SQLite 插入資料

华科云商小雪發表於2024-03-07

將Python字典資料插入SQLite資料庫中其實有很多好處,例如使用字典的結構可以簡化插入資料的程式碼,使其更加緊湊和易於理解。這降低了程式碼的複雜性,並使程式碼更易於維護。那麼在我們日常使用中會有哪些問題呢?一起看看我是如何解決的吧。

問題背景

我正在使用 Python 字典將資料插入到 SQLite 表中。我有一個如下所示的程式碼段來插入資料,其中 sqlDataDict 是一個字典,其中有16列:


cur.
execute(
''' INSERT INTO ProductAtt (imgID, productName, col1, col2, col3, col4, col5, col6, 

col7, col8, col9, col10, col11, col12, col13, col14)

VALUES (:imgID, :productName, :col1, :col2, :col3, :col4,:col5, :col6, :col7, :col8, :col9,
:col10, :col11, :col12, :col13, :col14 )''', sqlDataDict)

但在某些情況下,字典中的值可能不是完整的,即有些列可能沒有對應的值。當這種情況發生時,我收到錯誤訊息 "You did not supply a value for binding"。

解決方案

要解決這個問題,我們需要一種方法來處理字典中丟失的值。我們可以使用 None 值來表示這些丟失的值,然後在執行 SQL 語句之前將它們新增到字典中。這可以透過以下方式完成:


# 建立一個新的字典,將丟失的值用 None 填充

sqlDataDict = { key: value if value is not None else None for key, value in sqlDataDict. items()}

# 執行 SQL 語句
cur. execute( ''' INSERT INTO ProductAtt (imgID, productName, col1, col2, col3, col4, col5, col6,
col7, col8, col9, col10, col11, col12, col13, col14)

VALUES (:imgID, :productName, :col1, :col2, :col3, :col4,:col5, :col6, :col7, :col8, :col9,
:col10, :col11, :col12, :col13, :col14 )''', sqlDataDict)

現在,當字典中存在丟失的值時,SQL 語句仍然可以正常執行,而不會出現錯誤。

以下是一個使用此解決方案的完整程式碼示例:


import 
sqlite3


conn = sqlite3. connect( 'database.db')
cur = conn. cursor()

# 建立表
cur. execute( '''CREATE TABLE IF NOT EXISTS ProductAtt (
imgID INTEGER PRIMARY KEY,
productName TEXT,
col1 REAL,
col2 REAL,
col3 TEXT,
col4 TEXT,
col5 TEXT,
col6 REAL,
col7 TEXT,
col8 TEXT,
col9 TEXT,
col10 TEXT,
col11 TEXT,
col12 TEXT,
col13 TEXT,
col14 TEXT
)''')

# 準備資料
data = [
{ 'imgID': '1', 'productName': 'Product 1', 'col1': 'Value 1', 'col2': 'Value 2', 'col3': 'Value 3'},
{ 'imgID': '2', 'productName': 'Product 2', 'col1': 'Value 4', 'col2': 'Value 5', 'col4': 'Value 6'},
{ 'imgID': '3', 'productName': 'Product 3', 'col1': 'Value 7', 'col3': 'Value 8', 'col5': 'Value 9'},
]

# 插入資料
for row in data:
# 建立一個新的字典,將丟失的值用 None 填充
sqlDataDict = { key: value if value is not None else None for key, value in row. items()}

# 執行 SQL 語句
cur. execute( ''' INSERT INTO ProductAtt (imgID, productName, col1, col2, col3, col4, col5, col6,
col7, col8, col9, col10, col11, col12, col13, col14)

VALUES (:imgID, :productName, :col1, :col2, :col3, :col4,:col5, :col6, :col7, :col8, :col9,
:col10, :col11, :col12, :col13, :col14 )''', sqlDataDict)

# 提交事務
conn. commit()

# 關閉連線
conn. close()

這個解決方案可以確保即使字典中存在丟失的值,資料也能正確地插入到 SQLite 表中。

最後我們需要注意的是,雖然使用字典插入資料具有上述優點,但在我們實際應用中,也需要注意資料型別匹配、異常處理以及資料庫事務等方面的問題,以確保資料的完整性和一致性。

如果大家有任何技術上的問題,可以留言討論。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3008312/,如需轉載,請註明出處,否則將追究法律責任。

相關文章