hse*_*bie 1 python sqlalchemy pandas
我正在尝试删除现有表,执行查询,然后使用 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()
Run Code Online (Sandbox Code Playgroud)
你为什么要这样做?有一个更短的方法: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()
Run Code Online (Sandbox Code Playgroud)
根据文档:
替换:如果表存在,则删除它,重新创建它,然后插入数据。
诗。附加提示:
这是处理连接的更好方法:
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')
Run Code Online (Sandbox Code Playgroud)
因为它可以确保您的连接始终关闭,即使您的程序因错误退出。这对于防止数据损坏非常重要。此外,我只会使用这个:
import pandas as pd
...
pd.read_sql(sql, conn)
Run Code Online (Sandbox Code Playgroud)
而不是你正在做的方式。
所以,如果我处在你的位置编写该代码,它会如下所示:
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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11563 次 |
| 最近记录: |