Как определяется уникальное ограничение для трех столбцов?
Следующие 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),
)