我从一个带有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库?
1条答案
按热度按时间dkqlctbz1#
由于我在使用标准
sqlite3
库时运气不佳,所以我尝试使用sqlalchemy
,下面的方法可以解决这个问题: