Почему при обращении к первичному ключу возникает ошибка «не уникально»? - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть две модели -

Станция:

class Station(db.Model):
    """Measurement station"""
    __tablename__ = "station"

    reference = db.Column(db.Text, nullable=False, primary_key=True)
    name = db.Column(db.Text, nullable=False, primary_key=True)
    status = db.Column(db.Text)


    river_analyses = db.relationship("RiverAnalysis")

и

RiverAnalysis:

class RiverAnalysis(db.Model):
    __tablename__ = "river_analysis"
    id = db.Column(db.Integer, nullable=False, primary_key=True)
    reference = db.Column(db.Text, db.ForeignKey("station.reference"), nullable=False)

    station_ref = db.relationship("Station", foreign_keys=reference)

Когда я пытаюсь запустить flask db upgrade используя этот код миграции

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column('river_analysis', sa.Column('reference', sa.Text(), nullable=False))
    op.create_foreign_key(None, 'river_analysis', 'station', ['reference'], ['reference'])

Я получаю эту ошибку: (psycopg2.ProgrammingError) there is no unique constraint matching given keys for referenced table "station".

Почему я получаю это, хотя station.reference является первичным ключом Station?

Спасибо за любую помощь, которую вы можете предоставить.

1 Ответ

1 голос
/ 07 апреля 2019

reference один не ваш первичный ключ, а пара (reference, name).Чтобы ссылаться на этот ключ, вам нужно составное ограничение внешнего ключа :

class RiverAnalysis(db.Model):
    __tablename__ = "river_analysis"
    id = db.Column(db.Integer, nullable=False, primary_key=True)
    reference = db.Column(db.Text, nullable=False)
    name = db.Column(db.Text, nullable=False)

    __table_args__ = (
        db.ForeignKeyConstraint(
            [reference, name],
            ["station.reference", "station.name"]),
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...