КАК СДЕЛАТЬ ОБЪЕКТНОЕ ОТНОШЕНИЕ ОТНОШЕНИЯ (ORM) ДЛЯ ЭТОГО ЗАПРОСА? - PullRequest
1 голос
/ 17 апреля 2020

Я пытаюсь преобразовать мой sql запрос в python код с помощью flask -SQLAlchemy. Я застрял на одном запросе. есть таблицы с именами рейсы и пассажиры , где flight_id (пассажиры) - это внешний ключ, а id (рейсы) - первичный ключ.

Мой sql -запрос:

SELECT * FROM flights JOIN
passengers ON flights.id=passengers.flight_id;

, пожалуйста, помогите мне преобразовать его в python

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Если ваши модели выглядят примерно так (это чисто 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 для создания отношений и запрос с объединениями .

0 голосов
/ 17 апреля 2020

попробуйте это:

db.session.query(flights,passengers).filter
(flights.id==passenger.flight_id).all()
...