Если ваши модели выглядят примерно так (это чисто 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)
для каждого пассажира, выполняющего рейс.
См. учебник по Sqlalchemy ORM для создания отношений и запрос с объединениями .