C'è il metodo DataFrame.to_sql, ma funziona solo con i database mysql, sqlite e oracle. Non posso passare a questo metodo di connessione postgres o al motore sqlalchemy.Come scrivere DataFrame nella tabella Postgres?
risposta
A partire da panda 0.14 (rilasciato alla fine di maggio 2014), postgresql è supportato. Il modulo sql
ora utilizza sqlalchemy
per supportare diversi tipi di database. È possibile passare un motore sqlalchemy per un database postgresql (vedere docs). Es .:
from sqlalchemy import create_engine
engine = create_engine('postgresql://scott:[email protected]:5432/mydatabase')
df.to_sql('table_name', engine)
Lei ha ragione che in panda fino alla versione 0.13.1 PostgreSQL non è stato sostenuto. Se è necessario utilizzare una versione precedente di panda, questa è una versione corretta di pandas.io.sql
: https://gist.github.com/jorisvandenbossche/10841234.
Ho scritto questo tempo fa, quindi non posso garantire pienamente che funzioni sempre, ma la base dovrebbe essere lì). Se metti il file nella directory di lavoro e di importarlo, allora si dovrebbe essere in grado di fare (dove con
è una connessione PostgreSQL):
import sql # the patched version (file is named sql.py)
sql.write_frame(df, 'table_name', con, flavor='postgresql')
veloce opzione:
Seguendo codice copierà la vostra Pandas DF to postgres DB molto più veloce del metodo df.to_sql e non avrete bisogno di alcun file csv intermedio per memorizzare il df. Creare un motore in base alle specifiche del DB. Crea una tabella nel DB postgres con un numero uguale di colonne come Dataframe (df). I dati in DF avranno inserito nella tabella postgres.
from sqlalchemy import create_engine
import psycopg2
import io
engine=create_engine('postgresql+psycopg2://username:[email protected]:port/database')
conn=engine.raw_connection()
cur = conn.cursor()
output = io.StringIO()
df.to_csv(output, sep='\t', header=False, index=False)
output.seek(0)
contents = output.getvalue()
cur.copy_from(output, ‘table_name’, null="") #null values become ''
conn.commit()
Questo è diventato 0.14? – Quant
Sì, e anche 0.15 è già stato rilasciato (release candidate). Aggiornerò la risposta, grazie per avermelo chiesto. – joris
Questo post ha risolto il problema per me: http://stackoverflow.com/questions/24189150/pandas-writing-dataframe-to-other-postgresql-schema – srodriguex