Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLalchemy.filter无法按预期工作_Python_Sqlalchemy - Fatal编程技术网

Python SQLalchemy.filter无法按预期工作

Python SQLalchemy.filter无法按预期工作,python,sqlalchemy,Python,Sqlalchemy,我有以下疑问: question = Questions.query\ .filter(Questions.quiz_id == quiz.id) \ .filter(Responses.session_id == session[0].id) \ .filter(Responses.question_id != Questions.id) \ .order_by(Questions.category) \

我有以下疑问:

        question = Questions.query\
        .filter(Questions.quiz_id == quiz.id) \
        .filter(Responses.session_id == session[0].id) \
        .filter(Responses.question_id != Questions.id) \
        .order_by(Questions.category) \
        .order_by(func.rand()) \
        .first()
它的作用是:

从数据库中获取问题 确保问题来自正确的测验 在回答表中,检查哪些已回答的问题链接到此会话 确保下一个问题仍然没有回答,例如,问题ID尚未在responses(回答)表中,且关联的会话ID尚未链接到该问题 按类别1至5订购 从列表中的第一个类别中随机选择一个问题 只有在responses表中已经有答案时,这一切都可以正常工作。但是,当这是第一个要回答的问题时,它将返回None。我怀疑这是因为它在responses表中找不到会话id。所以这条线可能是原因:

.filter(Responses.session_id == session[0].id) \
不幸的是,我对这里的解决方案一无所知。它不在排序中,因为当我注释掉这些行时,它会产生相同的结果。其次,当我生成原始MySQL查询时,它通过连接question_id==question.id和session_id==session.id上的两个表来工作。所以在MySQL中,这个问题不会发生。这使我更加相信问题出在.filter选项中

目前的解决方法是首先检查responses表中是否有一行包含当前会话id。如果没有,我知道这是第一个问题,只需在会话_id上省略.filter。这可以工作,但是一个额外的调用,我认为这是不必要的


请帮助我,提前谢谢。

您的分析是正确的,问题是由那里的.filter子句引起的。我将重写查询以使用WHERE NOT EXISTS。这意味着,如果没有与问题匹配的响应,则仍将返回

responses\u this\u session=Response.query\ .filterResponses.session_id==会话[0]。id question=Questions.query\ .filterQuestions.quick_id==quick.id\ .filter~存在 本次会议的回应 .filterResponses.question_id==Questions.id .order_byQuestions.category\ .order_byfunc.rand\ 第一 或相当于:

question=Questions.query\ .filterQuestions.quick_id==quick.id\ 滤器 ~z~在哪里 和_Responses.session _id==会话[0].id, Responses.question_id==Questions.id .order_byQuestions.category\ .order_byfunc.rand\ 第一 匹配的SQL:

选择问题* 从问题 其中,测验id=12 而且不存在 挑选* 从回应中 其中session\u id='my\u session\u id' 和回答.question_id=questions.id 按类别排序,兰特