sqlalchemy在多个列中是唯一的

假设我有一个代表位置的类。 地点“属于”客户。 位置由unicode 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中无法轻松添加需求。 唯一= True选项似乎只适用于特定字段时才起作用,并且会导致整个表只针对所有位置具有唯一的代码。

Column的文档中提取:

unique – 如果为True,表示该列包含唯一约束,或者如果index为True,则表示应该使用唯一标志创build索引。 要在约束/索引中指定多个列或指定显式名称,请明确使用UniqueConstraint或Index构造。

由于这些属于表而不属于映射类,因此在表定义中声明这些__table_args__ ,或者如果在__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'), )