【发布时间】:2020-01-29 02:51:00
【问题描述】:
在 sqlite 的情况下,我们是否可以在每个数据帧插入后轻松提交尚不清楚。 (假设自动提交默认关闭,遵循 python 数据库包装约定)。
使用最简单的 sqlalchemy api 流程 ―
db_engine = db.create_engine()
for .....
# slowly compute some_df, takes a lot of time
some_df.to_sql(con = db_engine)
我们如何确保每个.to_sql 都被提交?
出于动机,想象一下特定的用例是每次写入都反映了可能非常长的计算的结果,我们不希望丢失大量此类计算,也不想丢失任何一个,以防机器出现故障或者如果 python sqlalchemy 引擎对象在其所有写入实际耗尽数据库之前被垃圾收集。
我相信自动提交默认是关闭的,对于 sqlite,没有办法在create_engine 命令中改变它。使用简单的.to_sql api 时,添加自动提交行为或在每次数据帧写入后显式提交的最简单、最安全的方法是什么?
或者是否必须重构代码以使用不同的 api 流来完成?
【问题讨论】:
-
db_engine = db_engine.execution_options(autocommit=True)? -
这应该可以。当我迷失在所涉及的三个库的有些复杂的 API 文档中时,我自己没能找到它。我猜您可以将其发布为答案。
-
SQLA 引擎默认处于自动提交模式,至少在 1.3 之前的版本中是这样。 “如果 python sqlalchemy 引擎对象在其所有写入实际上都在数据库中耗尽之前被垃圾收集”似乎不会发生。
-
@IljaEveril are you absolutely sure?
-
是的。您粘贴的链接是指(ORM)会话,它可以使用引擎作为绑定,但不是引擎。
标签: python pandas sqlite sqlalchemy