Vindicar
@Vindicar
RTFM!

Составной ключ, часть которого — внешний ключ?

Я пытаюсь описать в декларативном стиле две модели.
Первая, упрощённо:
class Course(BaseModel):
    __tablename__ = 'course'

    id: Mapped[int] = mapped_column(primary_key=True, comment='ID курса')
    fullname: Mapped[str] = mapped_column(nullable=False, comment='Полное название курса')

Вторая модель описывает что-то типа association object, но одна из сторон отношения отсутствует в БД.
class CoursePlugin(BaseModel):
    __tablename__ = 'course_plugin'
    # я знаю, что primary_key неприменим к relationship(). Это просто чтобы передать идею
    course: Mapped[Course] = relationship(primary_key=True, back_populates='active_plugins')  
    plugin: Mapped[str] = mapped_column(primary_key=True, nullable=False, comment='ID плагина')
    enabled: Mapped[bool] = mapped_column(nullable=False, comment='Плагин активен')

У меня в БД нет и не планируется таблицы plugin. Поэтому мне просто нужно, чтобы сочетание (course.id, plugin) было уникальным, и работало как первичный ключ. Я знаю, как это сделать в голом SQL, но не пойму, как этого добиться от SqlAlchemy.

Можно ли этого добиться при соблюдении следующих условий:
1. работая в декларативном, а не императивном стиле
2. не создавая таблицу-словарь, содержащую возможные значения plugin (если её создать, получаем обычный многие-ко-многим с привязанным association object)
3. не добавляя синтетический ключ в CoursePlugin
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы