小编phi*_*ee2的帖子

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

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

class MyModel(db.Model):
    foo = db.Column(db.String(255))
    bar = db.Column(db.String(255))
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法,但似乎都不起作用。一种可能性是监听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")
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)

python database orm sqlalchemy

6
推荐指数
1
解决办法
446
查看次数

标签 统计

database ×1

orm ×1

python ×1

sqlalchemy ×1