2016-08-09 13 views
0

私は既存のテーブルを削除し、クエリを実行してから、pandas to_sql関数を使用してテーブルを再作成しようとしています。このクエリはpgadminで動作しますが、ここでは動作しません。これがパンダのバグかどうか、私のコードが間違っているかどうかの考えはありますか?SQLAlchemyを使用してpandas to_sqlのテーブルを削除できません

具体的なエラーが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() 

答えて

2

なぜあなたはそのようにこれをやっているのですか?短い方法があります:if_exists kwagがto_sqlにあります。これを試してみてください:

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

docsによると:表が存在する場合は、それをドロップし、それを再作成し、データを挿入します。

交換してください。


Psと。追加のヒントは:それはあなたのプログラムがエラーで終了した場合でも、あなたの接続が常に閉じていることを保証しているので

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

これは、接続を処理するための良い方法です。これは、データの破損を防ぐために重要です。さらに、私はちょうどこれを使用します:

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

あなたがそれをやっているのではなく。

私はそのコードを書いて、あなたのところにあったのであれば、それは次のようになります。

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

、これは新しいものである場合、私は知りませんが、どうやらパンダは(今)も使用することができますエンジン。例えば。 'df.to_sql( 'a'、con = engine、schema = schema_name、if_exists = 'replace')' – n1000

関連する問題