在Flask-SqlAlchemy中连接表

时间:2017-02-01 09:04:06

标签: python sqlalchemy

假设我有几个表并想要执行连接查询:

schedule_calendars = ScheduleCalendar.query\
            .join(Schedule)\
            .join(ClinicBranchHasDoctor)\
            .filter_by(clinic_branch_id=clinic_id, doctor_has_specialty_id=doctor_speciality_id).all()

问题在于我的结果只包含ScheduleCalendar类的属性。如何查询,我的结果将包含所有连接表的属性。

时间表:

    id = Column(db.Integer, primary_key=True)
    added_date = Column(db.DateTime(timezone=True), default=get_current_time, nullable=False)
    start_date = Column(db.Date, nullable=False)
    name = Column(db.String(128), nullable=False)
    is_valid = Column(db.Boolean, default=IS_VALID, nullable=False)
    slot_size = Column(db.Integer, default=30)

ScheduleCalendar:

  schedule_id = Column(db.Integer, db.ForeignKey("schedules.id"), nullable=False)

ClientBranchHasDoctor:

schedule_id = Column(db.Integer, db.ForeignKey("schedules.id"), nullable=False)

我在这里跳过了一些属性。我认为最重要的是我的表有适当的约束,否则加入将失败。

2 个答案:

答案 0 :(得分:5)

您需要为您的班级添加一个反向引用。

例如,在您的ScheduleCalendar课程中,添加:

schedule_id = Column(db.Integer, db.ForeignKey("schedules.id"), nullable=False)
schedule = db.relationship("Schedule", back_populates="calendar", lazy="dynamic")

在你的Schedule课程中添加:

calendar = db.relationship("ScheduleCalendar", back_populates="schedule")

现在,您可以从Schedule访问ScheduleCalendar个对象。

在您的示例中,您可以像这样访问它:

schedule_calendars = ScheduleCalendar.query\
            .join(Schedule)\
            .join(ClinicBranchHasDoctor)\
            .filter_by(clinic_branch_id=clinic_id, doctor_has_specialty_id=doctor_speciality_id).all()

schedule_calendars[0].schedule

答案 1 :(得分:1)

我尝试了很多答案,但无法同时连接表以获取其列数据。按照@AArias 的建议创建反向引用后,您可以使用此代码获取表的数据。

results = db.session.query(Schedule, ScheduleCalendar, ClientBranchHasDoctor). \
      select_from(Schedule).join(ScheduleCalendar).join(ClientBranchHasDoctor).all()

for schedule,scheduleCalendar,hasDoctor in results:
     print(schedule.name, scheduleCalendar.schedule_id , hasDoctor.schedule_id)

这样可以同时访问3张表的所有数据。