여러 열에서 고유 한 sqlalchemy


174

위치를 나타내는 클래스가 있다고 가정 해 봅시다. 고객에게 "위치"위치. 위치는 유니 코드 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"의 두 고객이있는 경우 둘 다 "main"이라는 위치를 가질 수 있지만 main이라는 두 위치를 가질 수는 없습니다.

비즈니스 로직에서이를 처리 할 수 ​​있지만 sqlalchemy에 요구 사항을 쉽게 추가 할 수있는 방법이 없도록하고 싶습니다. unique = True 옵션은 특정 필드에 적용될 때만 작동하는 것으로 보이며 전체 테이블에 모든 위치에 대해 고유 한 코드 만 있습니다.

답변:


298

다음의 문서 에서 추출 하십시오 Column.

unique – 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'),
                     )

나는 같은 문제에 직면했지만 UniqueConstraint를 사용하면 도움이되지 않습니다. Index ( '...')으로 시도한 후 고유 제약 조건이 나타납니다. 이 행동에 대한 설명이 있습니까?
swdev

1
@swdev : 어떤 RDBMS를 사용하십니까?
van

3
고맙지 만 내 질문은 SA (및 Flask)를 사용하여 DB 스키마를 만들었습니까, 아니면 별도로 만들었습니까?
van

1
왜 .c. 익숙한?
스마일

1
@Smiley는 .c.바로 가기에있다.columns.

7
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

class Location(Base):
      __table_args__ = (
        # this can be db.PrimaryKeyConstraint if you want it to be a primary key
        db.UniqueConstraint('customer_id', 'location_code'))
      customer_id = Column(Integer,ForeignKey('customers.customer_id')
      location_code = Column(Unicode(10))

1
이어야합니다 __table_args__ = (db.UniqueConstraint('customer_id', 'location_code'),). 마지막에 쉼표를 잊지 마십시오.
bertdida
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.