使用SQLAlchemy在postgres中强制执行多列唯一性约束

时间:2018-04-02 05:08:58

标签: postgresql sqlalchemy

根据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的一部分的部分对话。为了强制执行此约束,我需要做的另一部分是什么?

1 个答案:

答案 0 :(得分:0)

Postgres约束不会仅对字段强制使用一个空值:

https://www.postgresql.org/docs/9.4/ddl-constraints.html

应该注意,如果检查表达式的计算结果为true或null值,则满足检查约束。由于大多数表达式在任何操作数为null的情况下都会求值为null,因此它们不会在受约束的列中阻止null值。为了确保一列不包含空值,可以使用下一节中所述的非空约束。

因此,为了使约束起作用,正如作者在自己的评论中指出的那样,请将您要约束的列设置为nullable=False

(向Ng Onne-Ee提问,以回答他们自己的问题,但认为明确回答可能对其他人有帮助)。