Уникальная sqlalchemy для нескольких столбцов - программирование
Подтвердить что ты не робот

Уникальная sqlalchemy для нескольких столбцов

Скажем, что у меня есть класс, который представляет местоположения. Местоположения "принадлежат" клиентам. Местоположения идентифицируются кодом символа Юникод 10. "Код местоположения" должен быть уникальным среди мест для конкретного клиента.

The two below fields in combination should be unique
customer_id = Column(Integer,ForeignKey('customers.customer_id')
location_code = Column(Unicode(10))

Итак, если у меня есть два клиента, клиент "123" и клиент "456". Они оба могут иметь место, называемое "основным", но не могут иметь два местоположения, называемые главными.

Я могу справиться с этим в бизнес-логике, но я хочу убедиться, что нет никакого способа легко добавить требование в sqlalchemy. Уникальный параметр = True работает только при применении к определенному полю, и это приведет к тому, что вся таблица будет иметь уникальный код для всех местоположений.

4b9b3361

Ответ 1

Из документации Column:

уникальный. Когда True, указывает, что этот столбец содержит уникальный ограничение, или если индекс тоже True, указывает, что индекс должен быть создан с уникальным флагом. Чтобы указать несколько столбцов в ограничение/индекс или указать явное имя, используйте UniqueConstraint или Index явно выражается.

Поскольку они относятся к таблице, а не к сопоставленному классу, объявляются те, которые указаны в определении таблицы, или если они используются как декларативные, как в __table_args__:

# version1: table definition
mytable = Table('mytable', meta,
    # ...
    Column('customer_id', Integer, ForeignKey('customers.customer_id')),
    Column('location_code', Unicode(10)),

    UniqueConstraint('customer_id', 'location_code', name='uix_1')
    )
# or the index, which will ensure uniqueness as well
Index('myindex', mytable.c.customer_id, mytable.c.location_code, unique=True)


# version2: declarative
class Location(Base):
    __tablename__ = 'locations'
    id = Column(Integer, primary_key = True)
    customer_id = Column(Integer, ForeignKey('customers.customer_id'), nullable=False)
    location_code = Column(Unicode(10), nullable=False)
    __table_args__ = (UniqueConstraint('customer_id', 'location_code', name='_customer_location_uc'),
                     )