循环通过超过6k的结果,想更新一个链接表,担心占用时间

2024-04-19 03:39:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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结果是否也有可能超时?你知道吗


Tags: 方法noneid应用程序sqlalchemysession方式query
1条回答
网友
1楼 · 发布于 2024-04-19 03:39:48

您可能有兴趣阅读这个关于yield_per()块中数据库游标状态的响应:https://stackoverflow.com/a/12233167/111033

基本上,在缓冲完所有结果之前,您无法真正提交—因此必须在循环结束时提交。你知道吗

yield_per()非常强大,可以解决很多内存管理问题,但是它相当脆弱,并且有一些相当大的限制,比如您发现的限制。你知道吗

相关问题 更多 >