Ole*_*nko 5 python sqlalchemy pytest flask-sqlalchemy
我正在使用 pytest 尝试 sqlalchemy,并且遇到以下问题
@pytest.fixture(scope='function')
def my_session(my_db, request):
from my.models import Session, Base
Base.metadata.bind = my_db
Base.metadata.create_all()
def teardown():
Base.metadata.drop_all()
Base.metadata.create_all()
request.addfinalizer(teardown)
Session.configure(bind=my_db)
return Session()
Run Code Online (Sandbox Code Playgroud)
但是由于某种原因,之前测试时存储到数据库中的数据仍然存在。我有点期待它在 .drop_all() 调用后消失:(
我在使用 SqlAlchemy 1.4 时遇到了这个问题。
我可以使用SqlAlchemy-Utils包使其工作,但Base.metadata.drop_all()实际上没有帮助。
相反,我使用了该函数drop_database(),然后create_database()重建它。
请注意,这drop_database会真正破坏它,而不仅仅是删除元数据。整个数据库将消失,您甚至无法连接到它。
在尝试下面的代码之前,请确保您确实正在使用测试环境!
另请注意,出于同样的原因,它可能会相当慢,特别是如果您在每次测试后都调用拆卸。
from sqlalchemy_utils.functions import create_database, drop_database
from my.models import Session, Base
@pytest.fixture(scope='function')
def my_session(my_db, request):
url = my_db.url
Base.metadata.bind = my_db
Base.metadata.create_all()
def teardown():
# Dropping...
drop_database(url)
# Recreating...
create_databse(url)
Base.metadata.create_all()
request.addfinalizer(teardown)
Session.configure(bind=my_db)
return Session()
Run Code Online (Sandbox Code Playgroud)