我正在尝试删除一个现有的表,执行一个查询,然后使用熊猫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()
发布于 2016-08-09 00:13:13
你为什么要这样做?有一个较短的方法:if_exists
kwag在to_sql
。试试这个:
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()
根据文档的说法:
替换:如果存在表,则删除该表,重新创建它,并插入数据。
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://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')
https://stackoverflow.com/questions/38840208
复制相似问题