модель многие-многие соединяются с SQLAlchemy - PullRequest
1 голос
/ 16 июня 2011

Я испытываю наихудшие времена, пытаясь заставить объединение многих-многих работать с использованием моделей в SQLAlchemy. Я нашел много примеров в Интернете, но я не могу понять, представляют ли их строки имена столбцов, которые им нравятся, в сравнении с тем, что есть в таблицах базы данных, или они используют Table вместо декларативного модель, или что-то еще отличается, и их пример просто не работает. В настоящее время у меня есть следующие настройки:

  • Таблицы базы данных TAG_TEST, TAG и TEST
  • TAG_TEST имеет TS_TEST_ID, TG_TAG_ID и TG_TYPE (внешние ключи)
  • TAG имеет TG_TAG_ID и TG_TYPE
  • TEST имеет TS_TEST_ID

У меня есть следующие модели:

class Test(Base):
    from .tag import Tag
    from .tag_test import TagTest

    __tablename__ = u'TEST'
    id = Column(u'TS_TEST_ID', INTEGER(), primary_key=True, nullable=False)
    ...
    tags = relationship(Tag, secondary='TAG_TEST')

class Tag(Base):
    from .tag_test import TagTest
    __tablename__ = "TAG"
    id = Column(u'TG_TAG_ID', INTEGER(), primary_key=True, nullable=False)
    type = Column(u'TG_TYPE', VARCHAR(25))
    ...
    tests = relationship("Test", secondary='TAG_TEST')

class TagTest(Base):
    __tablename__ = u'TAG_TEST'
    tagID = Column(u'TG_TAG_ID', INTEGER(), ForeignKey("TAG.TG_TAG_ID"), primary_key=True, nullable=False)
    testID = Column(u'TS_TEST_ID', INTEGER(), ForeignKey("TEST.TS_TEST_ID"), primary_key=True, nullable=False)
    tagType = Column(u'TG_TYPE', VARCHAR(50), ForeignKey("TAG.TG_TYPE"), primary_key=True, nullable=False)
    ...
    tag = relationship("Tag", backref="testLinks")
    test = relationship("Test", backref="tagLinks")

В настоящее время я получаю следующую ошибку:

ArgumentError: Не удалось определить условие соединения между родительскими / дочерними таблицами в отношениях Tag.tests. Укажите выражение «primaryjoin». Если присутствует «вторичный», то также требуется «вторичное соединение».

Что я пропускаю / делаю неправильно?

1 Ответ

1 голос
/ 17 июня 2011

Хитрая часть с моим была составным внешним ключом к таблице Tag. Вот мои настройки:

class TagTest(Base):
    __table_args__ = (ForeignKeyConstraint(['TG_TAG_ID', 'TG_TYPE'],
        ['TAG.TG_TAG_ID', 'TAG.TG_TYPE']), {})
    tagID = Column(u'TG_TAG_ID', INTEGER(), primary_key=True, nullable=False)
    testID = Column(u'TS_TEST_ID', INTEGER(), ForeignKey("TEST.TS_TEST_ID"), primary_key=True, nullable=False)
    tagType = Column(u'TG_TYPE', VARCHAR(50), primary_key=True, nullable=False)
    tag = relationship(Tag, backref="testLinks")
    test = relationship(Test, backref="tagLinks")

class Tag(Base):
    tests = relationship("Test", secondary="TAG_TEST")

Затем, чтобы получить доступ к тестам, которые есть у тега, я могу сделать myTag.tests. Чтобы получить доступ к тегам, которые есть в тесте, я могу сделать myTest.tagLinks, а затем получить доступ к .tag для каждого объекта в свойстве .tagLinks. Не так аккуратно, как хотелось бы, но это работает.

...