首页 > 解决方案 > 带有事务的 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 创建。

  1. 为什么Oracle在事务提交之前创建表?据我所知,服务器端没有设置自动提交。

  2. 这是使用 pandas to_sql 事务的正确方法吗?可能不会,因为如果我想在同一个连接上进行 2 个事务,它将无法工作,因为 to_sql 将连接作为参数,而不是事务。

标签: pythonpandasoraclepostgresqltransactions

解决方案


推荐阅读