亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

sqlalchemy.exc.ResourceC 已關閉錯誤: 此連接已關閉錯誤

sqlalchemy.exc.ResourceC 已關閉錯誤: 此連接已關閉錯誤

一只萌萌小番薯 2022-09-13 19:25:54
我使用 測試來覆蓋項目。pytest在每個應用程序 () 中,我創建了 ,其中放置了帶有 .moduletests folderapplication tests在每個測試文件夾中,每個應用程序都有。conftest fixtures當我為每個應用程序(如pytest應用程序/用戶)單獨運行測試時,一切正常。但是,當我為第一個應用程序運行整個項目(只是 pytest)的測試時,但隨后它會拋出 sqlalchemy.exc.ResourceClosed錯誤:對于其他應用程序,此連接已關閉錯誤tests pass示例conftest.pyimport osimport pytestTESTDB = "test.db"TESTDB_PATH = os.path.join(basedir, TESTDB)@pytest.fixture(scope="session")def app(request):    """Session-wide test `Flask` application."""    app = create_app("config.TestConfig")    # Establish an application context before running the tests.    ctx = app.app_context()    ctx.push()    def teardown():        ctx.pop()    request.addfinalizer(teardown)    return [email protected](scope="session")def db(app, request):    """Session-wide test database."""    if os.path.exists(TESTDB_PATH):        os.unlink(TESTDB_PATH)    def teardown():        _db.drop_all()        try:            os.unlink(TESTDB_PATH)        except FileNotFoundError:            pass    _db.app = app    _db.create_all()    permission = PermissionModel(title="can_search_articles")    role = RoleModel(title="API User", permissions=[permission])    tag = TagModel(name="Test tag")    article = ArticleModel(        title="Test article",        legal_language="en",        abstract="",        state="Alaska",        tags=[tag],    )    _db.session.add_all([role, permission, tag, article])    _db.session.commit()    user1 = UserModel(email="[email protected]", role_id=role.id)    user2 = UserModel(email="[email protected]")    _db.session.add_all([user1, user2])    # Commit the changes for the users    _db.session.commit()    request.addfinalizer(teardown)    return [email protected](scope="function")def session(db, request):    """Creates a new database session for a test."""    connection = db.engine.connect()    transaction = connection.begin()    options = dict(bind=connection, binds={})    session = db.create_scoped_session(options=options)
查看完整描述

1 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

不能同時與 sqlite 數據庫建立兩個連接。此外,您在這里有兩個連接,一個在會話夾具中顯式連接,您自己打開和關閉它,第二個隱含在夾具()中,可能關閉不會在這里發生。因此,請嘗試僅使用一次隱式連接,而不是 db 和進程夾具僅使進程夾具:db_db.session


@pytest.fixture

def session(app):

    """Creates a new database session for a test."""

    db.app = app

    db.create_all()


    with db.engine.connect() as connection:

        with connection.begin() as transaction:

            options = dict(bind=connection, binds={})

            session = db.create_scoped_session(options=options)


            db.session = session


            prepare_data(session)


            yield session


            transaction.rollback()

            db.drop_all()

這里prepare_data是你的數據填充新數據庫:


def prepare_data(session):

    permission = PermissionModel(title="can_search_articles")

    role = RoleModel(title="API User", permissions=[permission])

    tag = TagModel(name="Test tag")

    article = ArticleModel(

        title="Test article",

        legal_language="en",

        abstract="",

        state="Alaska",

        tags=[tag],

    )

    session.add_all([role, permission, tag, article])

    session.commit()


    user1 = UserModel(email="[email protected]", role_id=role.id)

    user2 = UserModel(email="[email protected]")

    session.add_all([user1, user2])


    # Commit the changes for the users

    session.commit()

因為這里的會話夾具是函數范圍的,所以在每個測試中,你都會有一個數據庫。更實用的是,不要每次都完全填滿數據庫,而是將此prepare_data拆分為幾個單獨的夾具,每個夾具用于一個對象,并在確切需要的地方使用它們。


查看完整回答
反對 回復 2022-09-13
  • 1 回答
  • 0 關注
  • 380 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號