2014-06-12 14 views
10

Sto provando a scrivere un DataFrame panda su un database PostgreSQL, usando una tabella qualificata schema.Pandas che scrive dataframe su altro schema postgresql

Io uso il seguente codice:

import pandas.io.sql as psql 
from sqlalchemy import create_engine 

engine = create_engine(r'postgresql://some:[email protected]/db') 

c = engine.connect() 
conn = c.connection 

df = psql.read_sql("SELECT * FROM xxx", con=conn)  
df.to_sql('a_schema.test', engine) 

conn.close() 

Quello che succede è che i panda scrive in schema di "pubblico", in una tabella denominata 'a_schema.test', invece di scrivere nella tabella "test" in lo schema "a_schema".

Come posso chiedere ai panda di utilizzare uno schema diverso da quello pubblico?

Grazie

+0

Non è necessario creare un oggetto di connessione con 'engine.connect()', è sufficiente passare il motore a 'read_sql'. Inoltre, la funzione è disponibile nei panda di livello superiore, quindi non è necessario importare 'psql' per quello. – joris

+0

Sì, hai ragione. Risolto nella mia risposta. –

risposta

14

Aggiornamento: a partire da 0,15 panda, scrivendo a diverso schema di è supportato. Allora si sarà in grado di utilizzare il schema parola chiave argomento:

df.to_sql('test', engine, schema='a_schema') 

Scrivendo a diverso schema di non è ancora supportato in questo momento con i read_sql e to_sql funzioni (ma una richiesta di miglioramento è già stato archiviato: https://github.com/pydata/pandas/issues/7441).

Tuttavia, si può andare in giro per ora utilizzando l'interfaccia oggetto con PandasSQLAlchemy e fornendo un MetaData oggetto personalizzato:

meta = sqlalchemy.MetaData(engine, schema='a_schema') 
meta.reflect() 
pdsql = pd.io.sql.PandasSQLAlchemy(engine, meta=meta) 
pdsql.to_sql(df, 'test') 

Attenzione! Questa interfaccia (PandasSQLAlchemy) non è ancora veramente pubblica e continuerà a subire modifiche nella prossima versione di panda, ma è così che puoi farlo per pandas 0.14.

Aggiornamento: PandasSQLAlchemy è stato rinominato in SQLDatabase in panda 0.15.

+0

Questo ha funzionato per me, ma ho dovuto specificare "schema" kwarg in meta istanziazione. Ho scritto la mia risposta di conseguenza. –

1

Risolto, grazie alla risposta joris. Anche il codice è stato migliorato grazie al commento di joris, passando attorno al motore sqlalchemy invece degli oggetti di connessione.

import pandas as pd 
from sqlalchemy import create_engine, MetaData 

engine = create_engine(r'postgresql://some:[email protected]/db') 
meta = sqlalchemy.MetaData(engine, schema='a_schema') 
meta.reflect(engine, schema='a_schema') 
pdsql = pd.io.sql.PandasSQLAlchemy(engine, meta=meta) 

df = pd.read_sql("SELECT * FROM xxx", con=engine)  
pdsql.to_sql(df, 'test') 
+0

È vivo! Grazie! – srodriguex