如何避免两个查询并替换为join?

时间:2013-03-27 12:49:40

标签: python python-2.7 sqlalchemy

我有一个模型(使用 sqlalchemy )Person。此方案中的每个人只能有一个作业或没有作业(作业也是模型)。我需要检索字典数组(每个字典代表一个人,如果人在人的内部有工作嵌套作业字典)

[{"name":"Timothy", "age":26},
 {"name":"Jack", "age":34, "job":{"type":"programmer, "money":5}},
 ...
]

此刻我会像这样迭代人:

for person in session.query(PersonModel).all():
    result_person = create_dictionary_for_person()
    job = session.query(JobModel).filter(JobModel.person_id == person.id).first()
    if job:
        result_person['job'] = create_dictionary_for_job()

    some_list.append(result_person)

(create_dicti ...是转换的简单函数,JobModel在PersonModel上有外键person_id,都有主键id。)

有没有办法避免每个人有两个查询?

1 个答案:

答案 0 :(得分:2)

尝试使用PersonModelJobModel之间的关系,并将其设置为急切加载:

class PersonModel(Base):
    ...
    job = relationship('JobModel', lazy='joined')

您通常希望指定父母与子女之间的关系。如果您还需要从JobModel转到PersonModel,则可以指定backref,也可以将其设置为急切加载。