SQLAlchemy:CheckConstraint和@validates之间有什么区别

时间:2016-10-14 15:56:58

标签: python sqlalchemy

在SQLAlchemy模型中,添加CheckConstraint和添加@validates修饰验证方法有什么区别?是一个作用于数据库级别而另一个不是?是否有什么指导方针何时使用?

具体来说,使用

之间有什么区别
__table_args__ = (CheckConstraint('to_node_id != from_node_id'), )

@validates('from_node', 'to_node')
def validate_nodes_are_different(self, key, field):
    if key == 'to_node' and field and field is self.from_node:
            raise ValueError
    elif key == 'from_node' and field and field is self.to_node:
            raise ValueError
    return field

1 个答案:

答案 0 :(得分:1)

CheckConstraint是一个数据库级别的检查; @validates是一个Python级别的检查。数据库级检查更通用;即使您通过其他方式访问数据库,也会满足约束。 Python级别的检查更具表现力;你通常可以更容易地检查复杂的约束。

您应该考虑的另一件事是当您想要更改约束时会发生什么。更改约束时,CHECK约束将强制您更改现有数据以符合要求。 Python级约束允许您仅强制新数据符合约束。