2014-04-16 13 views

risposta

40

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') 
+0

Questo è diventato 0.14? – Quant

+0

Sì, e anche 0.15 è già stato rilasciato (release candidate). Aggiornerò la risposta, grazie per avermelo chiesto. – joris

+1

Questo post ha risolto il problema per me: http://stackoverflow.com/questions/24189150/pandas-writing-dataframe-to-other-postgresql-schema – srodriguex

5

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() 
Problemi correlati