我正在使用 SqlAlchemybefore_flush
事件来验证对象,然后再将它们保存在数据库中,如下所示:
from models import db
@event.listens_for(db.session, 'before_flush')
def validateSomething(session, flush_context, instances):
pass
我真的很想测试我在那里做什么。但是,在我的测试中 - 我正在使用 pytest - 使用夹具为每个测试创建一个新会话。它类似于此设置:http://alexmic.net/flask-sqlalchemy-pytest/函数范围的装置在会话旁边创建一个事务,并在拆解期间回滚/删除它们。
由于该事件是在models.db
的(作用域(会话上注册的,因此它不会针对测试中使用的会话的事件触发。有没有办法解决这个问题,所以事件在测试期间被触发?
listens_for()
允许侦听会话类的所有实例的事件,而不是侦听会话实例。因此,用SignallingSession
替换db.session
就成功了。
我遇到了同样的问题。取代
@event.listens_for(db.session, 'before_flush')
跟
from sqlalchemy.orm import Session
@event.listens_for(Session, 'before_flush')
为我解决了问题