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

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() 调用后消失:(

Ram*_*ias 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()
Run Code Online (Sandbox Code Playgroud)