Подтвердить что ты не робот

Не удалось собрать столбцы первичных ключей для сопоставленной таблицы.

Когда я пытаюсь создать миграцию схемы базы данных, я получаю странную ошибку. Можете ли вы, пожалуйста, помочь мне разобраться, что случилось? Благодарю!

Я получаю следующее:

$ python app.py db upgrade
[skipped]
sqlalchemy.exc.ArgumentError: Mapper Mapper|EssayStateAssociations|essay_associations could not assemble any primary key columns for mapped table 'essay_associations'

Моя модель:

class EssayStateAssociations(db.Model):
    __tablename__ = 'essay_associations'

    ALLOWED_APP_ESSAY_STATES = ["selected", "not_selected", "pending"]

    application_essay_id = db.Column(
        db.Integer,
        db.ForeignKey("application_essay.id"),
        primary_key=True),
    theme_essay_id = db.Column(
        db.Integer,
        db.ForeignKey("theme_essay.id"),
        primary_key=True),
    state = db.Column(db.String, default="pending")

    @validates('state')
    def validate_app_essay_states(self, key, state):
        assert state in self.ALLOWED_APP_ESSAY_STATES
        return state

Версии:

Flask==0.10.1
Flask-Migrate==1.2.0
Flask-SQLAlchemy==1.0
SQLAlchemy==0.9.4
4b9b3361

Ответ 1

В таблице не может быть двух первичных ключей. Вместо этого вы должны использовать составной первичный ключ. Это можно сделать, добавив PrimaryKeyConstraint в вашу модель, как показано ниже (не забудьте добавить запятую перед закрытием скобки в __table_args__:

from db import PrimaryKeyConstraint

class EssayStateAssociations(db.Model):
    __tablename__ = 'essay_associations'
    __table_args__ = (
        PrimaryKeyConstraint('application_essay_id', 'theme_essay_id'),
    )

    ALLOWED_APP_ESSAY_STATES = ["selected", "not_selected", "pending"]

    application_essay_id = db.Column(
        db.Integer,
        db.ForeignKey("application_essay.id"))
    theme_essay_id = db.Column(
        db.Integer,
        db.ForeignKey("theme_essay.id"))
    state = db.Column(db.String, default="pending")

    @validates('state')
    def validate_app_essay_states(self, key, state):
        assert state in self.ALLOWED_APP_ESSAY_STATES
        return state