SQLAlchemy内连接NoneType不可迭代以避免count()

0 投票
1 回答
1274 浏览
提问于 2025-04-18 08:56

我需要检查学生是否通过了这个考试,考试的ID在一个叫做marks的表里,这个表和学生表还有考试表是有关系的。

student, exam = session.query(StudentModel,MarkModel)
                       .join(MarkModel)
                       .filter(and_(StudentModel.uuid == uuid, MarkModel.exam_id == exam_id))
                       .first()

但是当这个数据不在数据库里时,我会遇到一个错误,提示NoneType is not iterable

我该怎么检查而不想触发这个错误呢?我希望避免执行两次或更多次查询(比如先用计数来检查)。

1 个回答

2

.first() 方法会返回一个查询结果,或者返回 None。如果没有找到匹配的结果,first() 就会返回 None,而尝试从 None 中提取内容会失败。

你可以通过先把结果存起来来明确检查是否是 None

result = session.query(StudentModel,MarkModel).join(MarkModel).filter(
    and_(StudentModel.uuid == uuid, MarkModel.exam_id == exam_id)).first()
if result is not None:
    student, exam = result

或者你也可以直接捕获异常:

try:
    student, exam = session.query(StudentModel,MarkModel).join(MarkModel).filter(
        and_(StudentModel.uuid == uuid, MarkModel.exam_id == exam_id)).first()
except TypeError:
    # None returned, unpacking failed
    student = exam = None

撰写回答