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