【问题标题】:Looping through over 6k results, want to update a linked table, worried about time taken循环超过6k结果,想更新链接表,担心耗时
【发布时间】:2019-05-13 04:50:37
【问题描述】:

我正在开发一个使用 Flask 和 SQLAlchemy 用 Python 编写的预先存在的应用程序(我没有创建这个应用程序)。我需要更新超过 6k 行。主表中的一行(称为 SurveyRequest)具有 3 个指向辅助表(AudioRecording)的外键。我需要遍历每个 SurveyRequest 行,然后根据这 3 个 ID,更新相应的 AudioRecording 行。

我对会话与 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 个链接的 AudioRecording 行。在 SurveyRequest 中,3 个外键是:audio_1、audio_2、audio_3。我的想法是将每个 ID 传递到一个单独的方法中,然后该方法将对特定的 AudioRecording 进行我需要做的更新。我有一种感觉,如果我进行更新并提交,它会以某种方式破坏 SurveyRequest 查询循环。

在 SQLAlchemy 中使用 session 的方式让我有点困惑。我可以在同一个会话中进行查询循环和更新吗?或者我是否需要为 AudioRecording 更新创建一个单独的会话?处理 6k 个结果是否可能超时?

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我将尝试该帖子中建议的代码。这可能是我要走的路
    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 2011-05-25
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多