我正在尝试在插入或更新SQLAlchemy模型之前对其进行验证,例如
class MyModel(db.Model):
foo = db.Column(db.String(255))
bar = db.Column(db.String(255))
我尝试了几种方法,但是似乎都没有用。一种可能性是听before_insert
和before_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_insert
和before_update
,但这不能处理更新情况。
我也尝试使用@validates
,例如
@validates('foo', 'bar')
def validate(self, key, val):
...
但是,验证依赖于两个属性,而每个属性分别调用validate
方法。这意味着,如果我尝试在模型上同时设置foo
和bar
,它会尝试验证已设置一个属性而未设置另一个属性的中间状态。