Как определяется уникальное ограничение для трех столбцов?

Следующие EventInvitation Модель - это простое приглашение для одного события, отправленное от одного пользователя другому. Я хотел бы убедиться, что приглашения уникальны для трех столбцов: to_user, from_user и event.

class EventInvitation(db.Model):
    __tablename__ = 'event_invitations'

    id = db.Column(db.Integer, primary_key = True)

    event_id = db.Column(db.Integer, db.ForeignKey('events.id'))
    event = db.relationship('Event',  foreign_keys=[event_id])
    created = db.Column(db.DateTime(), default=datetime.now)
    updated = db.Column(db.DateTime(), default=datetime.now,onupdate=datetime.now)

    from_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    from_user = db.relationship('User',  foreign_keys=[from_id])

    to_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    to_user = db.relationship('User',  foreign_keys=[to_id])

    cstrt = db.UniqueConstraint('event_id', 'from_id','to_id', name='uix_1')

Я пробовал с этим cstrt колонка, но это не работает. Ограничение должно работать на SQLite, а также на MySQL в производстве. Как я могу определить это уникальное ограничение?

2 ответа

Решение

Вам нужно добавить ограничение к таблице, а не к модели. Чтобы сделать это с помощью декларативного:

class EventInvitation(db.Model):
    # ...
    __table_args__ = (
        db.UniqueConstraint(event_id, from_id, to_id),
    )

Если таблица уже была создана в базе данных, вам нужно удалить таблицу и запустить db.create_all() снова, или используйте Alembic для изменения существующей таблицы с миграцией.

Я не согласен с принятым ответом. Не по этой причине код не работал.

Причина, по которой он не работал, заключается в том, что вы указали имя столбца.

Если вы напишете:

          cstrt = db.UniqueConstraint(event_id, from_id, to_id, name='uix_1')

Все будет нормально работать.

И, конечно же, он также работает с table_args:

          __table_args__ = (
    db.UniqueConstraint(event_id, from_id, to_id),
)
Другие вопросы по тегам