Pandas将数据框写入其他PostgreSQL模式

20

我想将一个pandas DataFrame写入到PostgreSQL数据库中,使用带有模式限定的表名。

我使用以下代码:

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

engine = create_engine(r'postgresql://some:user@host/db')

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

df = psql.read_sql("SELECT * FROM xxx", con=conn)    
df.to_sql('a_schema.test', engine)

conn.close()

发生的情况是pandas在名为“a_schema.test”的表中写入模式“public”,而不是在“a_schema”模式中的“test”表中进行写入。

我该如何指示pandas使用与public不同的模式?

谢谢


不需要使用 engine.connect() 创建连接对象,只需将引擎传递给 read_sql 即可。此外,该函数在顶级 pandas 中可用,因此无需导入 psql - joris
是的,你说得对。我在我的回答中进行了修正。 - Mauro Bianchi
2个回答

29

更新:从pandas 0.15开始,支持写入不同的schema。然后您将能够使用schema关键字参数:

df.to_sql('test', engine, schema='a_schema')

目前使用 read_sqlto_sql 函数还不支持向不同的模式(schema)写入数据(但已经提出了增强请求:https://github.com/pydata/pandas/issues/7441)。

不过,你可以暂时通过使用 PandasSQLAlchemy 的对象接口并提供自定义的 MetaData 对象来绕过此限制:

meta = sqlalchemy.MetaData(engine, schema='a_schema')
meta.reflect()
pdsql = pd.io.sql.PandasSQLAlchemy(engine, meta=meta)
pdsql.to_sql(df, 'test')

注意!这个接口 (PandasSQLAlchemy) 目前还不是真正的公共接口,将在下一个 Pandas 版本中继续进行更改,但以下是如何在 Pandas 0.14 中实现它。

更新: 在 Pandas 0.15 中,PandasSQLAlchemy 更名为 SQLDatabase


这对我有效,但我必须在元实例化中指定'schema'关键字参数。我相应地编写了我的答案。 - Mauro Bianchi

3
感谢Joris的回答,问题已经解决。 在Joris的评论帮助下,通过传递SQLAlchemy引擎而不是连接对象来改进了代码。
import pandas as pd
from sqlalchemy import create_engine, MetaData

engine = create_engine(r'postgresql://some:user@host/db')
meta = sqlalchemy.MetaData(engine, schema='a_schema')
meta.reflect(engine, schema='a_schema')
pdsql = pd.io.sql.PandasSQLAlchemy(engine, meta=meta)

df = pd.read_sql("SELECT * FROM xxx", con=engine)    
pdsql.to_sql(df, 'test')

这个解决方案在Panda 1.3.5上对我有效! - Cristián Vargas Acevedo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接