我正在尝试在插入或更新之前验证 SQLAlchemy 模型,例如
class MyModel(db.Model):
foo = db.Column(db.String(255))
bar = db.Column(db.String(255))
Run Code Online (Sandbox Code Playgroud)
我尝试了几种方法,但似乎都不起作用。一种可能性是监听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")
Run Code Online (Sandbox Code Playgroud)
这工作正常,但在测试中我会收到此错误,除非我回滚会话。
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()
Run Code Online (Sandbox Code Playgroud)
我可以调用session.rollback()测试,但我这似乎不正确,因为测试只是发出 PUT/POST 请求,不应该真正了解会话或任何 SQLAlchemy 内部结构。
另一种选择是监听init事件,而不是before_insertand before_update,但这不处理更新情况。
我也尝试使用@validates,例如
@validates('foo', 'bar')
def validate(self, key, …Run Code Online (Sandbox Code Playgroud)