gpt4 book ai didi

python - Pandas to_sql 无法写入 PostgreSQL 上除 'public' 之外的模式

转载 作者:行者123 更新时间:2023-11-29 12:28:56 29 4
gpt4 key购买 nike

我正在尝试将数据框的内容写入除“公共(public)”架构之外的架构中的表。我遵循了 Pandas writing dataframe to other postgresql schema 中描述的模式:

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

但是当我尝试写入表时:

pdsql.to_sql(df, 'table', if_exists='append')

我收到以下错误:

InvalidRequestError: Table 'schema.table' is already defined for this MetaData instance.  Specify 'extend_existing=True' to redefine options and columns on an existing Table object.

我还尝试将 extend_existing=True 添加到 reflect 调用中,但这似乎没有什么不同。

我怎样才能让 pandas 写入这个表?

最佳答案

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

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

正如我在链接 question 中所说,目前尚不支持使用 read_sqlto_sql 函数写入不同的模式(但已提交增强请求:https://github.com/pydata/pandas/issues/7441)。

但是,我描述了使用对象接口(interface)的变通方法。但我在那里描述的内容仅适用于添加表格一次,不适用于替换和/或附加表格。所以如果只是想添加,先删除已有的表,然后再写。

如果你想追加到表格中,下面是一些更 hacky 的解决方法。首先重定义has_tableget_table:

def has_table(self, name):
return self.engine.has_table(name, schema=self.meta.schema)

def get_table(self, table_name):
if self.meta.schema:
table_name = self.meta.schema + '.' + table_name
return self.meta.tables.get(table_name)

pd.io.sql.PandasSQLAlchemy.has_table = has_table
pd.io.sql.PandasSQLAlchemy.get_table = get_table

然后像你一样创建PandasSQLAlchemy对象,并写入数据:

meta = sqlalchemy.MetaData(engine, schema='schema')
meta.reflect()
pdsql = pd.io.sql.PandasSQLAlchemy(engine, meta=meta)
pdsql.to_sql(df, 'table', if_exists='append')

这显然不是好的方法,但我们正在努力为 0.15 提供更好的 API。如果您想提供帮助,请调用 https://github.com/pydata/pandas/issues/7441 .

当心!此接口(interface) (PandasSQLAlchemy) 尚未真正公开,在下一版本的 pandas 中仍会发生变化,但这是 pandas 0.14(.1) 的实现方式。

更新:PandasSQLAlchemy 在 pandas 0.15 中重命名为 SQLDatabase

关于python - Pandas to_sql 无法写入 PostgreSQL 上除 'public' 之外的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25173887/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com