【问题标题】:Advanced model validation in sqlalchemysqlalchemy 中的高级模型验证
【发布时间】:2013-11-04 16:52:11
【问题描述】:

我有以下型号:

class Foo(DeclarativeBase):
    code = Column(u'code', String(length=255))
    ctype = Column(u'ctype', String(length=255))

我需要验证一个字段,相对于另一个字段。

例如

if ctype == "bar" and code == "buzz": raise ValueError

提交时不要在数据库中创建对象和记录。如果没有引发异常,则照常创建。

我试过用。 Simple validators 并尝试使用before_insert mapper event 设置“before_insert”事件 并写了这样的代码:

def validate_foo(mapper, connection, target):
    if target.ctype == "bar" and target.code == "buzz":
        raise ValueError

event.listen(Foo, 'before_insert', validate_foo)

当 ctype == "bar" 和 code == "buzz" 时,它不会在 DB 中创建任何对象。它不会引发任何异常。但它会创建 Foo 对象实例(没有 db)。

进行此类验证的最佳方法是什么?

【问题讨论】:

  • 您如何定义“最佳”?有些人可能希望将此验证直接放在数据库中。其他人可能希望将其放入模型本身而不与 SQLAlchemy 绑定。其他人可能想要使用上面显示的 SQLAlchemy 事件。这个问题没有“正确答案”。您的实际问题是为什么没有调用您的 validate_foo 方法?如果是这样,您应该提供更多详细信息(例如,您可以在您希望触发验证事件但它没有触发的地方运行示例代码)
  • validate_foo 实际上被调用了,但看起来它是在单独的线程中调用的。而且我的代码没有收到该异常。

标签: python validation sqlalchemy


【解决方案1】:

我最终在 DB 中创建了触发器(我使用 postgresql)。并在 python 代码中捕获完整性错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2017-03-19
    • 2014-01-10
    相关资源
    最近更新 更多