【发布时间】: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()
我不明白哪个更好(就内存使用而言, 性能和健康)以及如何?
在第一种方法中,我 将所有对象累积到会话然后提交 最后发生。对于庞大的插入操作,是否添加 会话中的对象导致将它们添加到内存(RAM)或 别处?它们存储在哪里以及消耗了多少内存?
- 当我有大约一个 百万插入和更新。尝试 SQLAlchemy 核心也需要 同时执行。 100K 行选择插入和更新大约需要 25-30 分钟。有什么办法可以减少这种情况?
请指出正确的方向。提前致谢。
【问题讨论】:
标签: database orm transactions sqlalchemy