Я пытаюсь описать в декларативном стиле две модели.
Первая, упрощённо:
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