В настоящее время я переключаюсь с необработанных запросов 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