Можно ли сделать первичный ключ и внешний ключ уникальным вместе в sqlalchemy - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть такая таблица, и я хочу, чтобы siteid и device были уникальными, а также для этой таблицы должен быть первичный ключ. Поэтому я назначил устройство в качестве первичного ключа.

class SiteRoleMapping(db.Model):
    __table_name__ = "site_role_mapping"
    siteid = Column(ForeignKey(('cmp_site.id'), ondelete='CASCADE'), nullable=False)
    device = Column(String, primary_key=True)
    rolename = Column(String)
    description = Column(String, default="None")

1 Ответ

2 голосов
/ 24 февраля 2020

Не зная много о вашей базе данных, я думаю, что вы должны просто дать отображению Integer Primary Key и добавить уникальное ограничение на два поля, которые вы хотите иметь уникальными.

Например:

from sqlalchemy import UniqueConstraint

class SiteRoleMapping(db.Model):
    __table_name__ = "site_role_mapping"
    id = Column(Integer, primary_key)
    site_id = Column(ForeignKey('cmp_site.id', ondelete='CASCADE'), nullable=False)
    device = Column(String, primary_key=True)
    rolename = Column(String)
    description = Column(String, default="None")

    # add unique constraint
    __table_args__ = (UniqueConstraint('site_id', 'device'), )

Однако, читая сопоставление имен таблиц, создается впечатление, что вы реализуете связь «многие ко многим» между сайтами и ролями. Обычно это делается с использованием трех таблиц, одной для сайтов, одной для ролей и одной для сопоставления

Так что можно ожидать, что в сопоставлении будут два внешних ключа, а не один.

...