我正在尝试使用 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()
但由于某种原因,之前测试时存储到数据库的数据仍然存在。我有点期待它在 .drop_all() 调用后消失:(
我在使用 SqlAlchemy 1.4 时遇到了这个问题。
我可以使用SqlAlchemy 实用程序封装为Base.metadata.drop_all()
真的没有帮助。
相反,我使用了该函数drop_database() https://sqlalchemy-utils.readthedocs.io/en/latest/database_helpers.html#drop-database, then create_database() https://sqlalchemy-utils.readthedocs.io/en/latest/database_helpers.html#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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)