Pandas to_sql除了PostgreSQL上的“public”之外,无法写入架构

2024-06-16 10:10:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将数据帧的内容写入除“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调用中,但这似乎没有什么区别。

我怎样才能让熊猫给这张桌子写信?


Tags: tosqlsqlalchemy架构schemapostgresqltableengine
1条回答
网友
1楼 · 发布于 2024-06-16 10:10:37

更新:从pandas 0.15开始,支持写入不同的架构。然后可以使用schema关键字参数:

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

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

但是,我描述了使用对象接口的解决方法。但是我在这里描述的只适用于添加一次表,而不适用于替换和/或追加表。因此,如果只想添加,请先删除现有表,然后再次写入。

如果你想添加到表中,下面是一个更复杂的解决方法。首先重新定义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

当心!此接口(PandasSQLAlchemy)尚未真正公开,仍将在下一版本的pandas中进行更改,但这是为pandas 0.14(.1)执行此操作的方法。

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

相关问题 更多 >