熊猫将数据框写入其他 postgresql 模式
Posted
技术标签:
【中文标题】熊猫将数据框写入其他 postgresql 模式【英文标题】:Pandas writing dataframe to other postgresql schema 【发布时间】:2014-08-03 01:24:33 【问题描述】:我正在尝试将 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 使用不同于公共的架构?
谢谢
【问题讨论】:
不需要与engine.connect()
建立连接对象,您只需将引擎传递给read_sql
即可。此外,该功能在***熊猫中可用,因此无需为此导入psql
。
是的,你是对的。已在我的回答中修复。
【参考方案1】:
更新:从 pandas 0.15 开始,支持写入不同的架构。然后你就可以使用schema
关键字参数了:
df.to_sql('test', engine, schema='a_schema')
目前尚不支持使用 read_sql
和 to_sql
函数写入不同的架构(但已提交增强请求: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 做的。
更新:PandasSQLAlchemy
在 pandas 0.15 中重命名为 SQLDatabase
。
【讨论】:
这对我有用,但我必须在元实例化中指定 'schema' kwarg。我相应地写下了我的答案。【参考方案2】:已解决,感谢 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')
【讨论】:
以上是关于熊猫将数据框写入其他 postgresql 模式的主要内容,如果未能解决你的问题,请参考以下文章