2012-04-07 45 views
97

Giả sử tôi có một lớp đại diện cho vị trí. Vị trí "thuộc về" đối với khách hàng. Các vị trí được xác định bằng mã ký tự 10 unicode. "Mã vị trí" phải là duy nhất trong số các vị trí cho một khách hàng cụ thể.sqlalchemy duy nhất trên nhiều cột

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

Vì vậy, nếu tôi có hai khách hàng, khách hàng "123" và khách hàng "456". Cả hai đều có thể có một vị trí được gọi là "chính" nhưng không thể có hai vị trí được gọi là chính.

Tôi có thể xử lý điều này trong logic nghiệp vụ nhưng tôi muốn đảm bảo không có cách nào để dễ dàng thêm yêu cầu vào sqlalchemy. Tùy chọn unique = True dường như chỉ hoạt động khi được áp dụng cho một trường cụ thể và nó sẽ làm cho toàn bộ bảng chỉ có một mã duy nhất cho tất cả các vị trí.

Trả lời

174

Extract từ documentation của Column:

độc đáo - Khi Đúng, chỉ ra rằng cột này chứa một độc đáo hạn chế, hoặc nếu index là True là tốt, chỉ ra rằng chỉ số nên được tạo bằng cờ duy nhất. Để chỉ định nhiều cột trong ràng buộc/chỉ mục hoặc để chỉ định tên rõ ràng, hãy sử dụng các cấu trúc UniqueConstraint hoặc Index một cách rõ ràng.

Khi những thuộc về một Bảng và không để một lớp ánh xạ, một tuyên bố những người trong định nghĩa bảng, hoặc nếu sử dụng khai báo như trong __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'), 
        ) 
+0

tôi phải đối mặt với cùng một vấn đề cũng có, nhưng sử dụng UniqueConstraint không giúp tôi. Sau khi tôi thử với Index ('...') thì tôi có một ràng buộc duy nhất. Có bất kỳ lời giải thích nào về hành vi này không? – swdev

+1

@swdev: bạn sử dụng RDBMS nào? – van

+0

Tôi đang sử dụng PostgreSQL. Có vấn đề gì với điều này không? – swdev

Các vấn đề liên quan