2015-01-11 13 views
24

Voglio interrogare un database PostgreSQL e restituire l'output come un dataframe di Pandas.Restituisce il dataframe di Pandas dalla query PostgreSQL con sqlalchemy

Io uso sqlalchemy per creare una connessione al database:

from sqlalchemy import create_engine 
engine = create_engine('postgresql://[email protected]:5432/mydb') 

scrivo un dataframe Pandas a una tabella di database:

i=pd.read_csv(path) 
i.to_sql('Stat_Table',engine,if_exists='replace') 

Sulla base del docs, sembra pd.read_sql_query () dovrebbe accettare un motore SQLAlchemy:

a=pd.read_sql_query('select * from Stat_Table',con=engine) 

Ma t un errore:

ProgrammingError: (ProgrammingError) relation "stat_table" does not exist 

Sto usando la versione 0.14.1 di Pandas.

Qual è il modo giusto per farlo?

risposta

32

Sei morso dai problemi di sensibilità del caso (con) con PostgreSQL. Se si cita il nome della tabella nella query, funzionerà:

df = pd.read_sql_query('select * from "Stat_Table"',con=engine) 

Ma personalmente, vorrei consigliare a poco sempre usare nomi delle tabelle minuscole (e nomi di colonna), anche quando si scrive la tabella al database di prevenire tali problemi.


Dalla documentazione PostgreSQL (http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS):

Quoting an identifier also makes it case-sensitive, whereas unquoted names are always folded to lower case

per spiegare un po 'di più: avete scritto una tabella con il nome Stat_Table al database (e sqlalchemy citerete questo nome, in modo che sarà scritto come "Stat_Table" nel database di Postgres). Quando si esegue la query 'select * from Stat_Table', il nome della tabella non quotato verrà convertito in minuscolo stat_table, quindi viene visualizzato il messaggio che questa tabella non viene trovata.

Vedere ad es. Anche Are PostgreSQL column names case-sensitive?

+0

@AseemHegshetye questo è completamente estraneo alla domanda originale o questa risposta, quindi per favore fai una nuova domanda – joris

2

Il messaggio di errore vi sta dicendo che una tabella denominata:

stat_table 

non esiste (un relazione è un tavolo in Postgres dire). Quindi, ovviamente non è possibile selezionare le righe da esso. Controlla il tuo db dopo l'esecuzione:

i.to_sql('Stat_Table',engine,if_exists='replace') 

e vedere se una tabella con quel nome è stata creata nel db.

Quando uso la vostra dichiarazione di lettura:

df = pd.read_sql_query('select * from Stat_Table',con=engine) 

ho recuperare i dati da un db Postgres, quindi non c'è niente di sbagliato con esso.

+1

Grazie. Controllato e il tavolo è stato effettivamente creato. Come ha detto @joris, è stato un problema di maiuscole e minuscole nel nome della tabella: Ho riscritto la tabella: 'i.to_sql ('stat_table', engine, if_exists = 'replace')' e quindi funziona: 'a = pd.read_sql_query ('select * from stat_table', engine) ' – lmart999

+0

@ Imart999, Quando ho scritto: ** guarda se una tabella con quel nome è stata creata nel tuo db ** - ** quel nome ** si riferiva al nome in il messaggio di errore, che era 'stat_table'. Il nome del messaggio di errore è pertinente - con QUALSIASI errore si ottiene. E poiché python non fa MAI un errore, l'errore ha significato che il tuo codice non ha MAI creato una tabella denominata 'stat_name'. Guarda come ho postato il nome della tabella 'stat_name' nel suo paragrafo e l'ho evidenziato - che doveva dirigere la tua attenzione su di esso. – 7stud

+0

Giusto, ho capito. Ho visto entrambe le risposte contemporaneamente (era offline). Vedo che la tua risposta mi sta portando alla stessa risposta (ad esempio, assicurati che la tabella denominata 'stat_table' sia scritta) che @joris ha dichiarato esplicitamente (ad esempio, la distinzione tra maiuscole e minuscole). Apprezzo la risposta. – lmart999