pandas 使用panda的www.example.com _sql禁用自动提交DataFrame.to

eqqqjvef  于 2023-03-21  发布在  其他
关注(0)|答案(1)|浏览(183)

我从一个带有panda的DataFrame.read_sql_query的Oracle数据库中取出几个表,并将其插入到一个带有DataFrame.to_sql的本地sqlite数据库中,然后验证它,并抛出一个异常,如果验证失败,该异常将回滚更改。
不幸的是,调用DataFrame.to_sql会提交sqlite事务,因此失败的验证无法回滚更改。
我用这个上下文管理器处理事务:

@contextmanager
def transaction(connection: sqlite3.Connection) -> sqlite3.Connection:
    connection.isolation_level = None
    connection.execute("begin;")
    try:
        yield connection
        connection.execute("commit;")
    except Exception:
        connection.execute("rollback;")
        raise

它首先在提交行失败,OperationalError告诉我没有打开的事务失败,在回滚时出现完全相同的错误,这是可以理解的。
有没有方法可以指示panda不要提交它的操作,或者我必须用 manual insert重写它,或者使用不同的sqlite库?

dkqlctbz

dkqlctbz1#

由于我在使用标准sqlite3库时运气不佳,所以我尝试使用sqlalchemy,下面的方法可以解决这个问题:

engine = sqlalchemy.create_engine(f"sqlite:///c:\\path\\to\\db.sqlite")
    with sqlalchemy.orm.Session(bind=engine) as session, session.begin():
        ...
        data: pd.DataFrame = ...
        data.to_sql("table_name", session.connection(), if_exists="append", index=False)
        ...

相关问题