【问题标题】:Using SQLAlchemy sessions and transactions使用 SQLAlchemy 会话和事务
【发布时间】:2015-07-01 19:11:10
【问题描述】:

在学习 SQLAlchemy 时,我遇到了两种处理 SQLAlchemy 会话的方法。 一个是在初始化我的数据库时全局创建一次会话,例如:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

并在我随后的所有请求(我的所有插入/更新)操作中导入此 DBSession 实例。 当我这样做时,我的数据库操作具有以下结构:

with transaction manager:
    for each_item in huge_file_of_million_rows:
        DBSession.add(each_item)
        //More create, read, update and delete operations

假设我的 Zope 事务管理器为我处理,我不会在任何地方提交、刷新或回滚 (它在事务结束时提交,如果失败则回滚)

第二种方式,也是网络上最常提到的方式是: 像这样创建一个 DBSession 一次

    DBSession=sessionmaker(bind=engine)
    and then create a session instance of this per transaction:
    session = DBSession()

for row in huge_file_of_million_rows:
    for item in row:
        try:
            DBsesion.add(item)
                //More create, read, update and delete operations
                DBsession.flush()
                DBSession.commit()
        except:
            DBSession.rollback()
DBSession.close()
  1. 我不明白哪个更好(就内存使用而言, 性能和健康)以及如何?

  2. 在第一种方法中,我 将所有对象累积到会话然后提交 最后发生。对于庞大的插入操作,是否添加 会话中的对象导致将它们添加到内存(RAM)或 别处?它们存储在哪里以及消耗了多少内存?

  3. 当我有大约一个 百万插入和更新。尝试 SQLAlchemy 核心也需要 同时执行。 100K 行选择插入和更新大约需要 25-30 分钟。有什么办法可以减少这种情况?

请指出正确的方向。提前致谢。

【问题讨论】:

    标签: database orm transactions sqlalchemy


    【解决方案1】:

    在这里,您有一个非常通用的答案,并警告说我对zope 了解不多。只是一些简单的数据库启发式。希望对您有所帮助。

    1. 如何使用SQLAlchemy 会话: 先来看看自己的解释here

    正如他们所说:

    实例化 Session 的调用将放置在应用程序中数据库对话开始的位置。

    我不确定我是否理解您对方法 1 的意思。以防万一,警告:整个应用程序不应只有一个会话。您在数据库对话开始时实例化Session,但您肯定在应用程序中有几个点开始了不同的对话。 (如果您有不同的用户,我不确定您的文字)。

    1. 在大量操作结束时进行一次提交并不是一个好主意

    确实它会消耗内存,可能在您的python 程序的Session 对象中,并且肯定在数据库事务中。多少空间?用你提供的信息很难说;它将取决于查询、数据库...

    您可以使用分析器轻松估算它。考虑到如果您的资源用完,一切都会变慢(或停止)。

    1. 在处理批量文件时,每个寄存器一次提交也不是一个好主意

    这意味着您要求数据库每次对每一行都进行更改。当然太多了。尝试使用中间数,每 n 数百行提交一次。但随后它变得更加复杂;文件末尾的一次提交可确保文件已处理或未处理,而中间提交会强制您考虑,当某些事情失败时,您的文件已完成一半 - 您应该重新定位。

    至于您提到的时间,您提供的信息+您的数据库+机器是什么很难。无论如何,您的数字的数量级,每 15 毫秒选择 + 插入 + 更新,可能加上提交,听起来相当高,但或多或​​少在预期范围内(再次取决于查询 + 数据库 + 机器)......如果你必须经常插入如此多的寄存器,您可以考虑其他数据库解决方案;这将取决于您的情况,并且可能取决于方言,并且可能不会由 orm 提供,例如 SQLAlchemy

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 2020-05-27
      • 2021-04-18
      • 1970-01-01
      • 2013-11-23
      • 2018-02-08
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多