【问题标题】:auto-commit with pandas to_sql using sqlalchemy with sqlite使用带有 sqlite 的 sqlalchemy 使用 pandas to_sql 自动提交
【发布时间】: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 引擎对象在其所有写入实际上都在数据库中耗尽之前被垃圾收集”似乎不会发生。
  • 是的。您粘贴的链接是指(ORM)会话,它可以使用引擎作为绑定,但不是引擎。

标签: python pandas sqlite sqlalchemy


【解决方案1】:

您可以通过set the connection 自动提交:

db_engine = db_engine.execution_options(autocommit=True)

【讨论】:

    【解决方案2】:

    来自https://docs.sqlalchemy.org/en/13/core/connections.html#understanding-autocommit

    “自动提交”功能仅在未声明 Transaction 时才有效。这意味着该功能通常不与 ORM 一起使用,因为默认情况下Session 对象始终保持一个持续的Transaction

    在您的代码中,您没有提供任何显式事务,因此用作con引擎处于自动提交模式(由 SQLA 实现)。

    请注意,SQLAlchemy 实现了自己的自动提交,该自动提交独立于 DB-API 驱动程序可能的自动提交/非事务性功能。

    因此,“最简单,添加自动提交行为的最安全方法 - 或在每次数据帧写入后显式提交”是您已经拥有的,除非to_sql() 发出一些 SQLA 所做的时髦语句不识别为数据更改操作,至少最近没有。

    SQLA 自动提交功能可能会在下一个主要版本中退出,但我们必须拭目以待。

    【讨论】:

    • 非常感谢。我认为公平地说,从参考文档部分来看,这种行为对于普通人来说几乎是不可推断的,所以这很有帮助。如果我是维护者,我会改进该部分以使底线更加清晰。或者,当用户代码中没有明确的事务时,自动提交 的默认设置。
    • 感谢您对未来可能发生的变化的提醒。
    • 我将the other solution to this question 保留在我的代码中,以备将来兼容。
    猜你喜欢
    • 2015-08-18
    • 2014-09-12
    • 1970-01-01
    • 2015-06-03
    • 2020-11-20
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多