熊猫将数据框写入其他 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_sqlto_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 模式的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在熊猫数据框中运行 postgresql 查询?

将数据框字典写入 excel 文件会产生错误

如何将数据作为列写入熊猫

无法在熊猫数据框中按时间戳索引

使用其他行中的值将函数应用于熊猫数据框行

如何在熊猫数据框中的所有列中搜索模式,并在找到时将其复制到另一列