在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流来完成此操作?
发布于 2019-09-30 01:17:15
您可以通过以下方式set the connection到自动提交:
db_engine = db_engine.execution_options(autocommit=True)发布于 2019-09-30 01:33:14
来自https://docs.sqlalchemy.org/en/13/core/connections.html#understanding-autocommit
“自动提交”功能仅在未声明任何
Transaction时有效。这意味着该特性通常不会与对象关系模型一起使用,因为默认情况下,Session对象总是维护一个正在进行的Transaction。
在您的代码中,您没有提供任何显式事务,因此用作con的引擎处于自动提交模式(由con实现)。
请注意,SQLAlchemy实现了自己的自动提交,该自动提交独立于DB-API驱动程序可能的自动提交/非事务性特性。
因此,你已经有了“最简单的,添加自动提交行为的最安全的方法-或者在每次数据帧写入后显式提交”,除非to_sql()发出一些古怪的语句,SQLA不会将其识别为数据更改操作,至少最近没有。
SQLA自动提交功能可能会在下一个主要版本中被淘汰,但我们将不得不等待和观察。
https://stackoverflow.com/questions/58157226
复制相似问题