我正在使用Flask和SQLAlchemy开发一个用Python编写的预先存在的应用程序(我没有创建这个应用程序)。我需要更新超过6k行。主表中的一行(称为SurveyRequest)有3个外键指向辅助表(录音)。我需要遍历每个SurveyRequest行,然后根据这3个id,更新相应的AudioRecording行。你知道吗
我对session如何与SQLAlchemy相关有点困惑。你知道吗
我已经将查询设置为返回6k结果(我对此没有问题),这是我需要一些帮助的循环。你知道吗
我要用这个:
query = self.session.query(SurveyRequest).filter(
SurveyRequest.audio_1 != None,
SurveyRequest.audio_2 != None,
SurveyRequest.audio_3 != None,
SurveyRequest.sent_to_transcriber == None,
SurveyRequest.created_at < before_date,
SurveyRequest.participant_id >= 100000,
SurveyRequest.participant_id < 300000,
SurveyRequest.test_number == 1
)
for sr in query.yield_per(100).enable_eagerloads(False):
我使用yield是因为我不希望系统将所有6k结果都加载到内存中(除非有人能提出更好的方法?)。你知道吗
因此,对于每个SurveyRequest'sr'行,我需要更新3个链接的录音行。在SurveyRequest中,3个外键是:audio_1、audio_2、audio_3。我的想法是将每个ID传递到一个单独的方法中,然后该方法将对特定的录音进行更新。我有一种感觉,如果我进行更新并提交,它会以某种方式中断SurveyRequest查询循环。你知道吗
SQLAlchemy中session的使用方式让我有点困惑。我可以在同一个会话中执行查询循环和更新吗?或者我需要为录音更新做一个单独的会话吗?处理6k结果是否也有可能超时?你知道吗
您可能有兴趣阅读这个关于
yield_per()
块中数据库游标状态的响应:https://stackoverflow.com/a/12233167/111033基本上,在缓冲完所有结果之前,您无法真正提交—因此必须在循环结束时提交。你知道吗
yield_per()
非常强大,可以解决很多内存管理问题,但是它相当脆弱,并且有一些相当大的限制,比如您发现的限制。你知道吗相关问题 更多 >
编程相关推荐