【问题标题】:Right way for initializing SQLAlchemy初始化 SQLAlchemy 的正确方法
【发布时间】:2019-10-24 07:56:00
【问题描述】:

许多教程说用Flask(__name__) 创建一个应用程序,然后我们可以用SQLAlchemy(app) 初始化数据库。 但是,我不喜欢这种侵入式模型,因为应用程序本身不需要了解有关数据库的任何信息。

我认为更好的方法是创建一个名为 database 的模块并在那里初始化数据库。

模型应该 import db from database 并且应用应该只导入模型。

但是,使用这种方法,数据库模块必须以某种方式检索全局应用程序,这我不同意。

有没有在不导入主应用的情况下初始化数据库的属性方式?

【问题讨论】:

    标签: flask sqlalchemy database-abstraction


    【解决方案1】:

    这是我发现设置烧瓶应用程序的最简洁方法:
    在 app.py 中:

    from flask import Flask
    from app.settings import DevConfig
    from app.extensions import api, mysqldb, marsh, mongodb 
    
    def create_app(config=DevConfig):
        """Application factory. This is used to run the app from the root.
    
        :param config: Object to configure app stored in settings.py
        """
        app = Flask(__name__.split('.')[0])
        app.config.from_object(config)
        register_endpoints()
        register_extensions(app)  
        return app
    
    def register_extensions(app):
        """Registration of flask components."""
        mysqldb.init_app(app)
        marsh.init_app(app)
        mongodb.init_app(app)
        api.init_app(app)
    


    然后在 extensions.py 我会有这样的东西:

    from flask_restful import Api
    from flask_httpauth import HTTPBasicAuth
    from flask_sqlalchemy import SQLAlchemy
    from flask_marshmallow import Marshmallow
    from flask_pymongo import PyMongo
    
    mysqldb = SQLAlchemy()
    mongodb = PyMongo()
    marsh = Marshmallow()
    api = Api(prefix='/v1')
    auth = HTTPBasicAuth()
    

    这样我就可以分开了。可能有一种方法可以在扩展中循环 init_app,但在我看来它会不太干净。

    然后我从扩展文件中导入数据库。

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 2021-10-27
      • 2011-08-20
      • 2015-05-23
      相关资源
      最近更新 更多