不能使用SQLAlchemy在pandas to_sql中删除表

时间:2016-08-09 00:06:20

标签: python pandas sqlalchemy

我正在尝试删除现有表,执行查询,然后使用pandas to_sql函数重新创建表。此查询在pgadmin中有效,但不在此处。如果这是一个熊猫错误或我的代码是错误的任何想法?

具体错误为ValueError: Table 'a' already exists.

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

engine = create_engine(r'postgresql://user@localhost: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()

1 个答案:

答案 0 :(得分:3)

你为什么这样做?有一种较短的方式:if_exists中的to_sql kwag。试试这个:

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

engine = create_engine(r'postgresql://user@localhost: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

  

replace:如果表存在,则删除它,重新创建它,然后插入数据。

聚苯乙烯。补充提示:

这是处理连接的更好方法:

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://user@localhost: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')