Pandas DataFrame.to_sql() 不再适用于 sqlalchemy 2.0.1 engine.connect() 作为上下文管理器并且不会抛出任何错误

问题描述 投票:0回答:2

这段带有 pandas

1.5.3
sqlalchemy
2.0.1
的代码不再工作了,令人惊讶的是,它没有引发任何错误,代码静默通过:

# python 3.10.6
import pandas as pd # 1.5.3
import psycopg2 # '2.9.5 (dt dec pq3 ext lo64)'
from sqlalchemy import create_engine # 2.0.1


def connector():
    return psycopg2.connect(**DB_PARAMS)

engine = create_engine('postgresql+psycopg2://', creator=connector)

with engine.connect() as connection:
    df.to_sql(
        name='my_table',
        con=connection,
        if_exists='replace',
        index=False,
    )

目前,使用 sqlalchemy

2.0.1
我的表不再填充 DataFrame 内容。

而它已正确填充了 sqlalchemy 版本

1.4.45
.

编辑

显然,当我使用上下文管理器时它有效:

connection = engine.connect()

res.to_sql(
    name='my_table',
    con=connection,
    if_exists='replace',
    index=False
)
Out[2]: 133 # <- wondering what is this return code '133' here?

connection.commit()
connection.close()

我怎样才能让它与上下文管理器(又名

with
语句)一起工作?

python pandas sqlalchemy psycopg2 contextmanager
2个回答
8
投票

您正在使用的上下文管理器在退出时回滚。相反,使用

engine.begin()
,这将提交。

with engine.begin() as connection:
    df.to_sql(
        name='my_table',
        con=connection,
        if_exists='replace',
        index=False,
    )

0
投票

我有同样的问题。它似乎与 SQLAlchemy v2.x.x 有关。 https://github.com/pandas-dev/pandas/issues/35594 恢复到 1.4.17 版本,现在可以正常工作了。

© www.soinside.com 2019 - 2024. All rights reserved.