SQLAlchemy:在插入或更新之前验证模型的最佳方法是什么

时间:2018-06-22 22:31:36

标签: python database orm sqlalchemy

我正在尝试在插入或更新SQLAlchemy模型之前对其进行验证,例如

class MyModel(db.Model):
    foo = db.Column(db.String(255))
    bar = db.Column(db.String(255))

我尝试了几种方法,但是似乎都没有用。一种可能性是听before_insertbefore_update事件,例如

@event.listens_for(MyModel, 'before_insert')
@event.listens_for(MyModel, 'before_update')
def validate_my_model(mapper, connection, model):
    if not is_valid(model):
        raise Exception("the model isn't valid")

这正常,但是在测试中,除非回滚该会话,否则会出现此错误。

This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback()

我可以在测试中调用session.rollback(),但我似乎不正确,因为测试只是发出PUT / POST请求,并且对会话或任何SQLAlchemy内部信息一无所知。

另一种选择是监听init事件,而不是before_insertbefore_update,但这不能处理更新情况。

我也尝试使用@validates,例如

@validates('foo', 'bar')
def validate(self, key, val):
    ...

但是,验证依赖于两个属性,而每个属性分别调用validate方法。这意味着,如果我尝试在模型上同时设置foobar,它会尝试验证已设置一个属性而未设置另一个属性的中间状态。

0 个答案:

没有答案