根据sqlalchemy unique across multiple columns的答案(我正在使用声明版本,如下所示)我试图声明一个多列唯一性约束。
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'),
)
但是,当我使用相同的customer_id和location_code创建多个项目时,我没有从SQLAlchemy获得任何唯一性异常,并且项目已成功创建。
在链接答案下面的评论中,有一个关于指定UniqueConstraint只是DDL的一部分的部分对话。为了强制执行此约束,我需要做的另一部分是什么?
答案 0 :(得分:0)
Postgres约束不会仅对字段强制使用一个空值:
https://www.postgresql.org/docs/9.4/ddl-constraints.html
应该注意,如果检查表达式的计算结果为true或null值,则满足检查约束。由于大多数表达式在任何操作数为null的情况下都会求值为null,因此它们不会在受约束的列中阻止null值。为了确保一列不包含空值,可以使用下一节中所述的非空约束。
因此,为了使约束起作用,正如作者在自己的评论中指出的那样,请将您要约束的列设置为nullable=False
。
(向Ng Onne-Ee提问,以回答他们自己的问题,但认为明确回答可能对其他人有帮助)。