【发布时间】: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