【问题标题】:What is the proper way to validate an object with SqlAlchemy when the validation involves several fields?当验证涉及多个字段时,使用 SqlAlchemy 验证对象的正确方法是什么?
【发布时间】:2018-02-23 11:12:26
【问题描述】:

我有一个包含一组非常复杂的业务规则的类。想象一下“如果字段 A 的值为 4,字段 B 的值为 True,则字段 C 必须是一个至少包含 2 个元素的数组”等等。

我试图阻止用户添加不遵守这些规则的此类的实例。所以验证应该在创建和更新时都发生。

我看到 SqlAlchemy 提供了 validate 方法,但是当验证包含多个字段时,设置起来有点过于复杂。

替代方案似乎是before_insertbefore_update 事件。在这种情况下,这是正确的解决方案,还是我有其他未考虑过的替代方案?

【问题讨论】:

  • 数据库约束/触发器。

标签: python validation orm sqlalchemy flask-sqlalchemy


【解决方案1】:

这听起来像是一个相当具体的案例。即使可能在 DB 约束和/或 SQLAlchemy 范围内,您也只是在寻找这些检查以在创建和更新时运行,所以为什么不引入某种上下文处理器。

在 init 中你可以有:

def __init__(self, ..):
    # runs the checks and returns actions

不要使用 db.session.add(class_instance) 创建自己的伪上下文处理器:

def update_with_checks(class_instance):
    # runs the checks and returns either no action if fails or:
    db.session.add(class_instance)

当然,如果数据是在您的代码范围之外创建的,那么这会导致您的数据库可能会损害完整性的问题。保持数据库完整性的唯一方法是确保将约束写入数据库本身。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多