iT邦幫忙

1

python 批次寫入DB

  • 分享至 

  • xImage

目前我有一個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
這樣處理完後還要再轉一次總覺得很麻煩

看更多先前的討論...收起先前的討論...
souda iT邦高手 1 級 ‧ 2023-03-12 22:20:42 檢舉
建議您參考嘍
https://devpress.csdn.net/python/6304cbb57e6682346619cb2f.html
jasonb122 iT邦新手 5 級 ‧ 2023-03-12 23:11:12 檢舉
謝謝,不過我後來找到方法了,佔位符用這個方式寫就可以直接用dict塞值
```
cursor.executemany('INSERT INTO test_dict (member_id, club_id, fee, test_message, test_message_id, json) VALUES (%(member_id)s,%(club_id)s,%(fee)s,%(test_message)s,%(test_message_id)s,%(json)s)', data)
```
souda iT邦高手 1 級 ‧ 2023-03-14 11:01:19 檢舉
你沒有使用ORM來做喔! 應該會比sql insert 安全.
sql injection 應該要考慮.
jasonb122 iT邦新手 5 級 ‧ 2023-03-15 00:16:28 檢舉
我也想....但環境不允許你懂得......
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
JamesDoge
iT邦高手 1 級 ‧ 2023-03-13 10:40:38
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()

0
rbcplatform
iT邦見習生 ‧ 2023-03-13 15:35:08

感謝大大...

我要發表回答

立即登入回答