Database 使用SQLAlchemy会话和事务

Database 使用SQLAlchemy会话和事务,database,orm,transactions,sqlalchemy,Database,Orm,Transactions,Sqlalchemy,在学习SQLAlchemy时,我遇到了两种处理SQLAlchemy会话的方法。 一个是在初始化数据库时全局创建一次会话,如下所示: DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 并在随后的所有我的请求(所有我的插入/更新)操作中导入此DBSession实例。 执行此操作时,我的DB操作具有以下结构: with transaction manager: for each_ite

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

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
并在随后的所有我的请求(所有我的插入/更新)操作中导入此DBSession实例。 执行此操作时,我的DB操作具有以下结构:

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()
  • 我不知道哪一个更好(在内存使用方面, 性能,和健康)以及如何

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

  • 当我有大约一个小时的时间时,这两种方法往往都很慢 百万次插入和更新。尝试SQLAlchemy核心也需要 同时执行。100K行选择插入和更新大约需要 25-30分钟。有没有办法减少这种情况

  • 请给我指一下正确的方向。提前谢谢。

    这里有一个非常一般的答案,并警告我对zope不太了解。只是一些简单的数据库启发法。希望能有帮助

  • 如何使用
    SQLAlchemy
    会话: 首先,看看他们自己的解释
  • 正如他们所说:

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

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

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

    你可以很容易地用分析器来估计它。要考虑到,如果资源耗尽,一切都会变慢(或停止)

  • 在处理大容量文件时,每个寄存器一次提交也不是一个好主意
  • 这意味着您要求数据库对每一行每次都保持更改。当然太多了。尝试使用中间编号,每n百行提交一次。但随后它变得更加复杂;文件末尾的一次提交可确保文件已被处理或未被处理,而中间提交则迫使您在出现故障时考虑文件已完成一半—您应该重新定位

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