在学习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)或 别处?他们在哪里存储以及消耗了多少内存?
请指出正确的方向。提前谢谢。
答案 0 :(得分:1)
在这里,您有一个非常通用的答案,并且警告我对zope
一无所知。只是一些简单的数据库启发式。希望它有所帮助。
SQLAlchemy
个会话:
首先,看看他们自己的解释here 正如他们所说:
然后,实例化Session的调用将放置在数据库对话开始的应用程序中。
我不确定我理解方法1的含义。以防万一,警告:整个应用程序不应该只有一个会话。当数据库对话开始时,您实例化Session
,但您确实在应用程序中有几个点,您开始有不同的对话。 (如果你有不同的用户,我不确定你的文字。)
实际上,它会消耗内存,可能是在Session
程序的python
对象中,当然也在数据库事务中。多少空间?您提供的信息很难说;它将取决于数据库中的查询...
您可以使用分析器轻松估算它。考虑到如果资源耗尽,一切都会变慢(或停止)。
这意味着您要求数据库每次都为每行保留更改。当然太多了。尝试使用中间数字,提交每个 n 数百行。但后来变得更加复杂;文件末尾的一次提交可以确保文件处理与否,而中间提交会强制您考虑,当某些内容失败时,您的文件已经完成了一半 - 您应该重新定位。
至于你提到的时间,你提供的信息非常困难+你的数据库+机器是什么。无论如何,您的数字的数量级,每15ms一次选择+插入+更新,可能加上提交,听起来相当高,但或多或少在预期范围内(再次取决于查询+数据库+机器)...如果你必须经常插入这么多寄存器,你可以考虑其他数据库解决方案;它取决于您的场景,可能取决于方言,可能不会由orm
SQLAlchemy
提供。