sqlalchemy:无法在拆卸时删除数据库

问题描述 投票:0回答:1

我正在尝试使用 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() 调用后消失:(

python sqlalchemy flask-sqlalchemy pytest
1个回答
0
投票

我在使用 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()
© www.soinside.com 2019 - 2024. All rights reserved.