在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
答案 0 :(得分:1)
CheckConstraint
是一个数据库级别的检查; @validates
是一个Python级别的检查。数据库级检查更通用;即使您通过其他方式访问数据库,也会满足约束。 Python级别的检查更具表现力;你通常可以更容易地检查复杂的约束。
您应该考虑的另一件事是当您想要更改约束时会发生什么。更改约束时,CHECK
约束将强制您更改现有数据以符合要求。 Python级约束允许您仅强制新数据符合约束。