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