Цель объединения таблиц в SQLAlchemy - PullRequest
0 голосов
/ 23 февраля 2020

В настоящее время я переключаюсь с необработанных запросов SQL на пакет SQLAlchemy, и мне интересно, когда объединить эти таблицы.

У меня есть 3 таблицы. Актер и mov ie находятся в отношениях M: N. Actor_Mov ie - это таблица соединений:

class Actor(Base):
    __tablename__ = 'actor'

    act_id = Column(Integer, primary_key=True)
    last_name = Column(String(150), nullable=False, index=True)
    first_name = Column(String(150), nullable=False, index=True)
    movies = relationship('Movie', secondary='actor_movie')

    def __init__(self, last_name, first_name):
        self.last_name = last_name
        self.first_name = first_name

class Movie(Base):
    __tablename__ = 'movie'

    movie_id = Column(Integer, primary_key=True)
    title = Column(String(150))
    actors = relationship('Actor', secondary='actor_movie')

    def __init__(self, title):
        self.title = title

class ActorMovie(Base):
    __tablename__ = 'actor_movie'

    fk_actor_id = Column(Integer, ForeignKey('actor.act_id'), primary_key=True)
    fk_movie_id = Column(Integer, ForeignKey('movie.movie_id'), primary_key=True)

    def __init__(self, fk_actor_id, fk_movie_id):
        self.fk_actor_id = fk_actor_id
        self.fk_movie_id = fk_movie_id

Когда я пишу простой запрос, например:

result = session.query(Movie).filter(Movie.title == 'Terminator').first()

, я возвращаю объект Mov ie с полем актера. Это поле актера содержит InstrumentedList со всеми актерами, которые связаны с фильмом. Кажется, что это слишком много, когда отношения всегда объединяются.

Почему отношения заполняются автоматически и когда мне нужно ручное соединение? Основываясь на результате, я даже не уверен, что таблица соединений правильная. Это, кажется, самый "сырой" SQL способ. Я также видел альтернативные подходы, а именно:

Официальная документация по SQLAlchemy

1 Ответ

0 голосов
/ 23 февраля 2020

"Это кажется чрезмерной нагрузкой, когда отношения всегда объединяются."

Это не так. По умолчанию отношения выполняют выбор при первом обращении к ним - так называемая отложенная загрузка.

«Почему отношение заполняется автоматически»

К нему обращались в экземпляре и связь использует конфигурацию по умолчанию.

"... и когда мне нужно ручное соединение?"

Если вам нужно, например, отфильтровать запрос на основе в соответствующей таблице, или вы выбираете много фильмов и заранее знаете, что вам понадобятся все или некоторые из их актеров, хотя для многоплановой связи выбор в загрузке может быть лучше, чем объединение.

«Исходя из результата, я даже не уверен, что таблица соединений правильная».

Это правильный подход. SQLAlchemy - это ORM, а атрибуты отношений - это объектная сторона таблиц сопоставления и ассоциации / соединения, относительная сторона.

В целом цели практически такие же, как в raw SQL, но дескрипторы ORM в некоторых случаях присоединяется под колпаком, например, при интенсивной нагрузке, если настроен или проинструктирован для этого. Как говорится на домашней странице:

SQLAlchemy - это набор инструментов Python SQL и Object Relational Mapper, который дает разработчикам приложений полную мощность и гибкость SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...