初始化SQLAlchemy的正确方法

时间:2019-06-09 18:58:03

标签: flask sqlalchemy database-abstraction

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

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

模型应import db from database,应用程序应仅导入模型。

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

是否存在一种无需导入主应用程序即可初始化数据库的属性方法?

1 个答案:

答案 0 :(得分:0)

这是我发现设置烧瓶应用程序的最简洁的方法:
在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,但是我认为这样不太干净。

要使用,我然后从扩展文件中导入数据库。