Si vous voulez insérer en masse des Pandas DataFrame dans PostgreSQL, vous pouvez mettre SQLAlchemy et utiliser .to_sql ()
, mais lorsque vous utilisez psycopg2 comme client PostgreSQL, vous vous sentez comme "Je ne veux pas mettre SQLAlchemy juste pour ça". Devenir.
Alors j'ai pensé: "Si vous faites .to_csv () ʻ de DataFrame et que vous le lisez avec
.copy_from () ʻ de psycopg2, vous pouvez faire Bulk Insert."
from io import StringIO
import pandas as pd
import psycopg2
def df2db(conn: psycopg2.extensions.connection, df: pd.DataFrame, table: str):
buf = StringIO()
df.to_csv(buf, sep='\t', na_rep=r'\N', index=False, header=False)
buf.seek(0)
with conn.cursor() as cur:
cur.copy_from(buf, table, columns=df.columns)
Créez une fonction comme celle-ci
Par exemple, si vous souhaitez insérer en bloc un tel DataFrame dans une table appelée logs
dans PostgreSQL,
with psycopg2.connect('postgresql://...') as conn:
df2db(conn, df.reset_index(), 'logs')
Tu peux le faire.
Puisque l'index n'est pas sorti, si vous voulez mettre l'index dans la table, vous devez faire .reset_index ()
.
Recommended Posts