Python 使用绑定在多个数据库中回滚SQLAlchemy事务

Python 使用绑定在多个数据库中回滚SQLAlchemy事务,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我正在构建一个使用多个数据库的Flask应用程序,因此我使用SQLAlchemy绑定 由于我想隔离所有的测试,我已经创建了会话fixture,该fixture开始一个事务,并为每个测试创建一个作用域会话。测试完成后,我对事务应用回滚以再次获得初始状态 当我只有一个数据库时,这种方法工作得很好。但是,它不能与新绑定一起工作。在下面的示例中,我有三个测试: 测试一创建2个User对象(默认绑定) 测试二创建2个Message对象(messagesbind) 测试三创建1个用户和1个消息 回滚之后,我

我正在构建一个使用多个数据库的Flask应用程序,因此我使用SQLAlchemy绑定

由于我想隔离所有的测试,我已经创建了
会话
fixture,该fixture开始一个事务,并为每个测试创建一个
作用域会话
。测试完成后,我对事务应用回滚以再次获得初始状态

当我只有一个数据库时,这种方法工作得很好。但是,它不能与新绑定一起工作。在下面的示例中,我有三个测试:

  • 测试一创建2个
    User
    对象(默认绑定)
  • 测试二创建2个
    Message
    对象(
    messages
    bind)
  • 测试三创建1个
    用户
    和1个
    消息
  • 回滚之后,我打印每个表中的行数。
    用户
    表(默认绑定)始终被清除,但
    消息
    消息
    绑定)从不删除前面的行

    如何删除所有绑定的行

    导入pytest
    从烧瓶进口烧瓶
    从flask_sqlalchemy导入sqlalchemy
    db=SQLAlchemy()
    类用户(db.Model):
    id=db.Column(db.Integer,主键=True)
    username=db.Column(db.String(80))
    定义报告(自我):
    返回“%self.username”
    类消息(db.Model):
    __绑定键='消息'
    id=db.Column(db.Integer,主键=True)
    message=db.Column(db.String(80))
    定义报告(自我):
    返回“”%self.message
    def create_app():
    app=烧瓶(名称)
    app.config[
    'SQLALCHEMY_DATABASE_URI']='sqlite://'+'/tmp/users.db'
    app.config['SQLALCHEMY_BINDS']={
    'messages':'sqlite://'+'/tmp/messages.db'
    }
    返回应用程序
    @pytest.fixture(scope='session')
    def测试应用程序(请求):
    app=create_app()
    ctx=app.app\u context()
    ctx.push()
    def teardown():
    ctx.pop()
    request.addfinalizer(拆卸)
    返回应用程序
    @pytest.fixture(scope='session')
    def db_夹具(测试应用程序,请求):
    db.init_应用程序(测试_应用程序)
    db.create_all()
    def teardown():
    db.drop_all()
    request.addfinalizer(拆卸)
    返回数据库
    @pytest.fixture(scope='function')
    def会话(db_夹具,请求):
    connection=db_fixture.engine.connect()
    事务=连接。开始()
    options=dict(bind=connection,binds={})
    session=db\u fixture.create\u scoped\u session(options=options)
    db_fixture.session=会话
    def teardown():
    事务。回滚()
    打印()
    打印('Users:',len(User.query.all())
    打印('Messages:',len(Message.query.all())
    连接。关闭()
    session.remove()
    request.addfinalizer(拆卸)
    返回会话
    def测试两个用户(会话):
    admin=User(username='user1')
    guest=User(用户名='user2')
    会话添加(管理员)
    会话。添加(来宾)
    session.commit()
    users=User.query.all()
    断言len(用户)==2
    def test_two_my_bind_表(会话):
    message1=消息(Message='message1')
    message2=消息(Message='message2')
    session.add(message1)
    session.add(message2)
    session.commit()
    messages=Message.query.all()
    断言len(消息)==2
    def test_两个表(会话):
    admin=User(username='user3')
    行绑定=Message(Message='message2')
    会话添加(管理员)
    session.add(行绑定)
    session.commit()
    messages=Message.query.all()
    users=User.query.all()
    断言len(用户)==1
    断言len(消息)==1#