Python 烧瓶';炼金术不是';t回滚适当的事务?
我有一系列简单的集成测试,我想在每次测试后发布回滚。我面临的问题是,当我看到控制台中发出rollback语句时(我的配置中有Python 烧瓶';炼金术不是';t回滚适当的事务?,python,flask,sqlalchemy,flask-sqlalchemy,pytest,Python,Flask,Sqlalchemy,Flask Sqlalchemy,Pytest,我有一系列简单的集成测试,我想在每次测试后发布回滚。我面临的问题是,当我看到控制台中发出rollback语句时(我的配置中有SQLALCHEMY\u ECHO=True),数据仍然存在于数据库中。显然,我希望每次测试后插入的数据都会从数据库中消失 下面是一个示例,其代码刚好足以触发我的问题- import pytest from app import create_app from app import db as _db from app.main.models import Customer
SQLALCHEMY\u ECHO=True
),数据仍然存在于数据库中。显然,我希望每次测试后插入的数据都会从数据库中消失
下面是一个示例,其代码刚好足以触发我的问题-
import pytest
from app import create_app
from app import db as _db
from app.main.models import Customer
@pytest.yield_fixture(scope='session')
def app():
app = create_app('testing')
app_ctx = app.app_context()
app_ctx.push()
yield app
app_ctx.pop()
@pytest.yield_fixture(scope='session')
def db(app):
_db.app = app
_db.create_all()
yield _db
print('drop_all()')
@pytest.yield_fixture(scope='function')
def session(db):
conn = db.engine.connect()
trans = conn.begin()
session = db.create_scoped_session(options={ 'bind': conn })
db.session = session
yield session
trans.rollback()
conn.close()
session.remove()
def test_foo(session, app):
cust = Customer(name='foo')
session.add(cust)
cust2 = Customer(name='bar')
session.add(cust2)
session.commit()
client = app.test_client()
response = client.get('/api/customers')
from json import loads
json_response = loads(response.data.decode('utf-8'))
custs = json_response['customers']
assert len(custs) == 2
assert custs[0]['name'] == 'foo'
炼金术日志-
2015-09-24 13:56:27,601 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2015-09-24 13:56:27,667 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2015-09-24 13:56:27,669 INFO sqlalchemy.engine.base.Engine INSERT INTO customers (name) OUTPUT inserted.id VALUES (?)
2015-09-24 13:56:27,669 INFO sqlalchemy.engine.base.Engine ('foo')
2015-09-24 13:56:27,715 INFO sqlalchemy.engine.base.Engine INSERT INTO customers (name) OUTPUT inserted.id VALUES (?)
2015-09-24 13:56:27,715 INFO sqlalchemy.engine.base.Engine ('bar')
2015-09-24 13:56:27,749 INFO sqlalchemy.engine.base.Engine COMMIT
2015-09-24 13:56:27,779 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2015-09-24 13:56:27,779 INFO sqlalchemy.engine.base.Engine SELECT customers.id AS customers_id, customers.name AS customers_name FROM customers
2015-09-24 13:56:27,780 INFO sqlalchemy.engine.base.Engine ()
2015-09-24 13:56:27,827 INFO sqlalchemy.engine.base.Engine ROLLBACK
2015-09-24 13:56:27,827 INFO sqlalchemy.engine.base.Engine ROLLBACK
如您所见,有3个隐式事务正在启动,但只有2个回滚。为什么我在测试会话期间开始的事务没有回滚
我已经阅读了SQLAlchemy关于在测试期间回滚的文档,但没有什么突出的