目前我有一個list 內含多組dict 例如下面的內容:
[{'member_id': 31, 'club_id': 5, 'fee': 25.07, 'test_message': 'test', 'test_message_id': 1903.0, 'json': 'test'}, {'member_id': 46, 'club_id': 1, 'fee': 36.27, 'test_message': 'test', 'test_message_id': 578.0, 'json': 'test'}, {'member_id': 90, 'club_id': 5, 'fee': 10.47, 'test_message': 'test', 'test_message_id': 964.0, 'json': 'test'}, {'member_id': 98, 'club_id': 2, 'fee': 18.13, 'test_message': 'test', 'test_message_id': 1231.0, 'json': 'test'}, {'member_id': 52, 'club_id': 4, 'fee': 38.51, 'test_message': 'test', 'test_message_id': 834.0, 'json': 'test'}, {'member_id': 30, 'club_id': 5, 'fee': 19.51, 'test_message': 'test', 'test_message_id': 896.0, 'json': 'test'}, {'member_id': 48, 'club_id': 2, 'fee': 38.03, 'test_message': 'test', 'test_message_id': 1444.0, 'json': 'test'}, {'member_id': 99, 'club_id': 2, 'fee': 31.43, 'test_message': 'test', 'test_message_id': 717.0, 'json': 'test'}, {'member_id': 63, 'club_id': 1, 'fee': 34.43, 'test_message': 'test', 'test_message_id': 1117.0, 'json': 'test'}, {'member_id': 23, 'club_id': 2, 'fee': 14.3, 'test_message': 'test', 'test_message_id': 674.0, 'json': 'test'}]
目前想使用executemany的方式來一次寫入所有資料
但是除了把dict轉為tuple之外 目前怎麼嘗試都沒辦法正確寫入
難道沒有辦法直接用dict的值寫入嗎?
畢竟select出來的資料通常都是list包dict
這樣處理完後還要再轉一次總覺得很麻煩
import psycopg2
# 連接資料庫
conn = psycopg2.connect(database="database_name", user="username", password="password", host="localhost", port="5432")
cur = conn.cursor()
# 資料表名稱
table_name = "table_name"
# list 內含多組 dict
data = [
{'member_id': 31, 'club_id': 5, 'fee': 25.07, 'test_message': 'test', 'test_message_id': 1903.0, 'json': 'test'},
{'member_id': 46, 'club_id': 1, 'fee': 36.27, 'test_message': 'test', 'test_message_id': 578.0, 'json': 'test'},
{'member_id': 90, 'club_id': 5, 'fee': 10.47, 'test_message': 'test', 'test_message_id': 964.0, 'json': 'test'},
{'member_id': 98, 'club_id': 2, 'fee': 18.13, 'test_message': 'test', 'test_message_id': 1231.0, 'json': 'test'},
{'member_id': 52, 'club_id': 4, 'fee': 38.51, 'test_message': 'test', 'test_message_id': 834.0, 'json': 'test'},
{'member_id': 30, 'club_id': 5, 'fee': 19.51, 'test_message': 'test', 'test_message_id': 896.0, 'json': 'test'},
{'member_id': 48, 'club_id': 2, 'fee': 38.03, 'test_message': 'test', 'test_message_id': 1444.0, 'json': 'test'},
{'member_id': 99, 'club_id': 2, 'fee': 31.43, 'test_message': 'test', 'test_message_id': 717.0, 'json': 'test'},
{'member_id': 63, 'club_id': 1, 'fee': 34.43, 'test_message': 'test', 'test_message_id': 1117.0, 'json': 'test'},
{'member_id': 23, 'club_id': 2, 'fee': 14.3, 'test_message': 'test', 'test_message_id': 674.0, 'json': 'test'}
]
# 列名稱
columns = data[0].keys()
# 將資料中的 dict 轉換為 tuple
values = [tuple(item.values()) for item in data]
# SQL 語句
insert_sql = "INSERT INTO {} ({}) VALUES %s".format(table_name, ", ".join(columns))
# 執行插入
cur.execute(insert_sql, (values,))
conn.commit()
# 關閉連接
cur.close()
conn.close()