簡體   English   中英

Python SQLAlchemy 燒瓶模式

[英]Python SQLAlchemy flask patterns

我有一個項目,我將 db.py 模塊定義為:

app = get_global_flask_app()
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://foo:bar@127.0.0.1:5432/test"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db = SQLAlchemy(app)
db.create_all()

然后我將 db.db 導入到需要查詢數據庫和插入數據的模塊中(db.session.query())。

但是,這意味着當我編寫測試代碼 (pytest) 來測試任何導入 db.py 的模塊時,我將需要定義“SQLALCHEMY_DATABASE_URI”。 一種解決方案是將 db 設為惰性屬性,以便僅在使用/測試數據庫時才在測試中執行上述代碼。 是否有我缺少的 Flask() + SQLA + SQLALCHEMY_DATABASE_URI 的通用設計模式? 你會如何解決這個問題? 燒瓶配置?

我們通常解決這個問題的方法是使用應用程序工廠和配置。

這意味着您的項目中某處有一個函數,看起來像這樣(取自文檔並進行了修改):

def create_app(config_filename, settings_override=None):
    app = Flask(__name__)
    app.config.from_pyfile(config_filename)
    app.config.from_object(settings_override)

    from yourapplication.model import db
    db.init_app(app)

    from yourapplication.views.admin import admin
    from yourapplication.views.frontend import frontend
    app.register_blueprint(admin)
    app.register_blueprint(frontend)

    return app

然后(希望您使用的是 pytest)在您的根測試目錄中,您有一個conftest文件,它會自動准備您的測試環境,如下所示:

import pytest
from your_project import create_app


class TestConfig:
    SQLALCHEMY_DATABASE_URI = "postgresql://foo:bar@127.0.0.1:5432/test"
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    ANY OTHER SETTINGS...


@pytest.fixture(autouse=True)
def app(request):
    app = create_app(settings_override=TestConfig)
    ctx = app.app_context()
    ctx.push()

    def teardown():
        ctx.pop()

    request.addfinalizer(teardown)

    return app

通常,我們創建另一個夾具,它也是autouse=True來處理數據庫設置、刷新和可能的加載夾具,並且只在需要訪問數據庫的測試(集成或功能測試)中使用該夾具,這意味着簡單我們將其包含在與集成測試相同的目錄中的conftest文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM