2015-01-11 5 views
24

Ich möchte eine PostgreSQL-Datenbank abfragen und die Ausgabe als Pandas-Dataframe zurückgeben.Pandas Dataframe aus PostgreSQL-Abfrage mit sqlalchemy zurückgeben

I sqlalchemy verwenden, um eine Verbindung der die Datenbank zu erstellen:

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

ich Pandas Datenrahmen zu einer Datenbanktabelle schreiben:

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

Basierend auf dem docs, sieht aus wie pd.read_sql_query () sollte eine SQLAlchemy-Engine akzeptieren:

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

Aber es t hrows ein Fehler:

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

Ich benutze Pandas Version 0.14.1.

Was ist der richtige Weg?

Antwort

32

Sie sind von den Fall (Un) Empfindlichkeitsprobleme mit PostgreSQL gebissen. Wenn Sie den Tabellennamen in der Abfrage zitieren, wird es funktionieren:

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

Aber persönlich würde ich nur immer tiefer Fall Tabellennamen verwenden, raten (und Spaltennamen), auch wenn das Schreiben der Tabelle in der Datenbank zu verhindern solche Probleme.


Aus der PostgreSQL-Dokumentation (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

ein bisschen mehr zu erklären: Sie eine Tabelle mit dem Namen geschrieben haben Stat_Table auf die Datenbank (und sqlalchemy diesen Namen zitieren, so dass es wird in der Postgres-Datenbank als "Stat_Table" geschrieben. Wenn Sie die Abfrage 'select * from Stat_Table' ausführen, wird der Name der nicht angegebenen Tabelle in Kleinbuchstaben stat_table konvertiert, und Sie erhalten die Meldung, dass diese Tabelle nicht gefunden wird.

Siehe zB auch Are PostgreSQL column names case-sensitive?

+0

@AseemHegshetye Dies ist völlig unabhängig von der ursprünglichen Frage oder dieser Antwort, also stellen Sie bitte eine neue Frage – joris

2

Die Fehlermeldung sagt Ihnen, dass eine Tabelle mit dem Namen:

stat_table 

existiert nicht (a Beziehung ist eine Tabelle, in Postgres sprechen). Sie können also natürlich keine Zeilen daraus auswählen. Überprüfen Sie Ihre Datenbank nach der Ausführung:

und sehen, ob eine Tabelle mit diesem Namen in Ihrer Datenbank erstellt wurde.

Wenn ich Ihre Leseanweisung verwenden:

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

ich die Daten wieder aus einer Postgres db, so gibt es nichts zu beanstanden.

+1

Danke. Überprüft und der Tisch wurde tatsächlich erstellt. Wie @joris sagte, es war ein Groß-/Kleinschreibung-Problem in Tabellenname: Ich schrieb die Tabelle neu: 'i.to_sql ('stat_table', engine, if_exists = 'replace')' und dann funktioniert es: 'a = pd.read_sql_query ('select * from stat_table', engine) ' – lmart999

+0

@ Imart999, Als ich schrieb: ** schau ob eine Tabelle mit diesem Namen in deiner Datenbank erstellt wurde ** - ** dieser Name ** bezog sich auf den Namen in die Fehlermeldung, die 'stat_table' war. Der Name der Fehlermeldung ist relevant - mit jedem Fehler, den Sie bekommen. Und weil Python NIEMALS einen Fehler macht, hat der Fehler dazu geführt, dass Ihr Code NIE eine Tabelle namens 'stat_name' erstellt hat. Sehen Sie, wie ich den Tabellennamen 'stat_name' in einen eigenen Absatz gestellt und markiert habe - das sollte Ihre Aufmerksamkeit darauf lenken. – 7stud

+0

Richtig, ich verstehe es. Ich sah beide Antworten gleichzeitig (war offline). Ich sehe, dass Ihre Antwort mich zu derselben Antwort führt (z. B. sicherstellen, dass die Tabelle mit dem Namen "stat_table" geschrieben wird), die von @jor explizit angegeben wird (z. B. Berücksichtigung der Groß-/Kleinschreibung). Schätze die Antwort. – lmart999