假设您的模型看起来像这样(这是纯 sqlalchemy,而不是 flask-sqlalchemy):
import sqlalchemy as sa
from sqlalchemy import orm
class Flight(Base):
__tablename__ = 'flights'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String(64))
passengers = orm.relationship('Passenger', back_populates='flight')
class Passenger(Base):
__tablename__ = 'passengers'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String(64))
flight_id = sa.Column(sa.Integer, sa.ForeignKey('flights.id'))
flight = orm.relationship('Flight', back_populates='passengers')
那么这个查询:
session.query(Flight).join(Passenger)
执行时会生成这条SQL:
SELECT flights.id AS flights_id, flights.name AS flights_name
FROM flights JOIN passengers ON flights.id = passengers.flight_id
并将返回所有至少有一名乘客的飞行对象。
相比之下,这个查询:
session.query(Flight, Passenger).filter(Flight.id == Passenger.flight_id)
生成此 SQL:
SELECT flights.id AS flights_id, flights.name AS flights_name, passengers.id AS passengers_id, passengers.name AS passengers_name, passengers.flight_id AS passengers_flight_id
FROM flights, passengers
WHERE flights.id = passengers.flight_id
它为每个有航班的乘客返回一个 (Flight, Passenger) 元组。
请参阅 creating relationships 和 querying with joins 的 Sqlalchemy ORM 教程。