python - 带有事务的 Pandas to_sql
问题描述
我正在尝试将 pandas to_sql 与多个事务一起使用,以便如果任何 to_sql 调用失败,那么所有事务都将被回滚。我的测试代码是:
import pandas as pd
import sqlalchemy
data = {'col1': ['val1', 'val2'],
'col2': ['val3', 'val4']}
df = pd.DataFrame(data, columns=['col1', 'col2'])
engine_pg = sqlalchemy.create_engine('postgresql://user:pass@localhost:5432/postgres')
engine_ora = sqlalchemy.create_engine('oracle://user:pass@localhost:1521/orcl', max_identifier_length=128)
conn_pg = engine_pg.connect()
conn_ora = engine_ora.connect()
trans_pg = conn_pg.begin()
trans_ora = conn_ora.begin()
try:
df.to_sql('table', conn_pg, schema='public', if_exists='replace', index=False)
df.to_sql('table', conn_ora, schema='user', if_exists='replace', index=False) #1
trans_pg.commit() #2
trans_ora.commit()
except Exception:
trans_pg.rollback()
trans_ora.rollback()
这似乎适用于 Postgres,但不适用于 Oracle。Postgres 中的表是按预期在 #2 提交后创建的,但 Oracle 表已在 #1 创建。
为什么Oracle在事务提交之前创建表?据我所知,服务器端没有设置自动提交。
这是使用 pandas to_sql 事务的正确方法吗?可能不会,因为如果我想在同一个连接上进行 2 个事务,它将无法工作,因为 to_sql 将连接作为参数,而不是事务。
解决方案
推荐阅读
- sql - LEFT OUTER JOIN 查询不包含左表的结果
- curl - 使用 zlib 交叉编译 curl:检查 -lz 中的 gzread ... 否
- laravel - REDIS 为 150k 个密钥消耗 20GB 的 RAM
- ruby-on-rails - 向 API 端点发送 POST 请求以接收 stripe_user_id
- c# - Elasticsearch Nest Client - 搜索嵌套属性
- html - 如何将充满预订的日历添加到养老金网站?
- physics - 击中目标所需的角速度
- javascript - 如何使用 Papa 解析器解析本地机器上的 csv 文件?
- hyperledger-fabric - 实例化链码时如何解决“在检索块之前完成上下文:上下文已取消”?
- android - 在 Android Studio/Gradle 中编译捆绑库的问题