使用SQLAlchemy会话和事务

时间:2015-04-23 14:16:53

标签: database orm transactions sqlalchemy

在学习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分钟。有没有办法减少这个?
  4. 请指出正确的方向。提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

  1. 如何使用SQLAlchemy个会话: 首先,看看他们自己的解释here
  2. 正如他们所说:

      

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

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

    1. 大量操作结束时的一次提交不是一个好主意
    2. 实际上,它会消耗内存,可能是在Session程序的python对象中,当然也在数据库事务中。多少空间?您提供的信息很难说;它将取决于数据库中的查询...

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

      1. 处理批量文件时,每个寄存器一次提交也不是一个好主意
      2. 这意味着您要求数据库每次都为每行保留更改。当然太多了。尝试使用中间数字,提交每个 n 数百行。但后来变得更加复杂;文件末尾的一次提交可以确保文件处理与否,而中间提交会强制您考虑,当某些内容失败时,您的文件已经完成了一半 - 您应该重新定位。

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