我正在尝试使用 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-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()