2016-08-09 38 views
0

Ich versuche, eine vorhandene Tabelle löschen, eine Abfrage ausführen und dann erstellen Sie die Tabelle mithilfe der Pandas To_sql-Funktion. Diese Abfrage funktioniert in pgadmin, aber nicht hier. Irgendwelche Ideen, ob das ein Pandas Bug ist oder ob mein Code falsch ist?Kann nicht Tabelle in Pandas to_sql mit SQLAlchemy

Spezifische Fehler ist ValueError: Table 'a' already exists.

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

engine = create_engine(r'postgresql://[email protected]:port/dbname') 

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

sql = """ 
drop table a; 
select * from some_table limit 1; 
""" 
df = psql.read_sql(sql, con=conn) 
print df.head() 
df.to_sql('a', engine) 

conn.close() 

Antwort

2

Warum sind Sie dies so zu tun? Es gibt einen kürzeren Weg: if_exists kwag in to_sql. Versuchen Sie folgendes:

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

engine = create_engine(r'postgresql://[email protected]:port/dbname') 

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

sql = """ 
select * from some_table limit 1; 
""" 
df = psql.read_sql(sql, con=conn) 
print df.head() 
# Notice how below line is different. You forgot the schema argument 
df.to_sql('a', con=conn, schema=schema_name, if_exists='replace') 

conn.close() 

Nach docs:

ersetzen: Wenn die Tabelle vorhanden ist, löschen sie, neu erstellen und Daten einfügen.


Ps. Weiterer Tipp:

Das ist besser Weg, um die Verbindung zu handhaben:

with engine.connect() as conn, conn.begin(): 
    sql = """select * from some_table limit 1""" 
    df = psql.read_sql(sql, con=conn) 
    print df.head() 
    df.to_sql('a', con=conn, schema=schema_name, if_exists='replace') 

Weil es, dass Ihre Verbindung sorgt für immer geschlossen ist, auch wenn Ihr Programm mit einem Fehler beendet. Dies ist wichtig, um Datenkorruption zu verhindern. Weiterhin würde ich einfach folgendes verwenden:

import pandas as pd 
... 
pd.read_sql(sql, conn) 

statt wie du es machst.

Also, wenn ich an Ihrer Stelle bin, dass das Schreiben von Code, würde es so aussehen:

import pandas as pd 
from sqlalchemy import create_engine 

engine = create_engine(r'postgresql://[email protected]:port/dbname') 

with engine.connect() as conn, conn.begin(): 
    df = pd.read_sql('select * from some_table limit 1', con=conn) 
    print df.head() 
    df.to_sql('a', con=conn, schema=schema_name, if_exists='replace') 
+0

Ich weiß nicht, ob dies eine neue Sache ist, aber anscheinend kann Pandas (jetzt) ​​auch die Verwendung Motor direkt. Z.B. 'df.to_sql ('a', con = engine, schema = schema_name, if_exists = 'ersetzen')' – n1000