Как создать отношения из существующих отношений в SQLAlchemy? - PullRequest
0 голосов
/ 26 июня 2011

Я немного застрял в отношениях в sqlalchemy.У меня есть такая модель:

engine = create_engine('sqlite:///tvdb.db', echo=True)
Base = declarative_base(bind=engine)

episodes_writers = Table('episodes_writers_assoc', Base.metadata,
    Column('episode_id', Integer, ForeignKey('episodes.id')),
    Column('writer_id', Integer, ForeignKey('writers.id')),
    Column('series_id', Integer, ForeignKey('episodes.series_id'))

class Show(Base):
    __tablename__ = 'shows'

    id = Column(Integer, primary_key = True)
    episodes = relationship('Episode', backref = 'shows')

class Episode(Base):
    __tablename__ = 'episodes'

    id = Column(Integer, primary_key = True)
    series_id = Column(Integer, ForeignKey('shows.id'))
    writers = relationship('Writer', secondary = 'episodes_writers',
                           backref = 'episodes')

class Writer(Base):
    __tablename__ = 'writers'

    id = Column(Integer, primary_key = True)
    name = Column(Unicode)

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

sqlalchemy.exc.ArgumentError: Could not determine join condition between parent/child tables on relationship Episode.writers.  Specify a 'primaryjoin' expression.  If 'secondary' is present, 'secondaryjoin' is needed as well.

Так что я явно что-то не так делаю с объявлениями отношений.Как мне создать правильные первичные соединения, чтобы добиться того, что я пытаюсь сделать здесь?

1 Ответ

0 голосов
/ 26 июня 2011

Исправление предлагается прямо в сообщении об ошибке.В любом случае, вам не нужен столбец, который денормализует вашу схему;Writer.shows может быть ассоциацией прокси.

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