【问题标题】:Python SQLAlchemy flask patternsPython SQLAlchemy 烧瓶模式
【发布时间】:2018-04-02 13:04:00
【问题描述】:

我有一个项目,我已将我的 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 是否有一个我缺少的通用设计模式?你将如何解决这个问题?烧瓶配置?

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我们通常解决这个问题的方法是使用application factory 和配置。

    这意味着您的项目中某处有一个看起来像这样的函数(取自经过修改的文档):

    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 文件。

    【讨论】:

      猜你喜欢
      • 2012-12-29
      • 1970-01-01
      • 2014-07-20
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2015-12-14
      相关资源
      最近更新 更多