Правильный способ инициализации SQLAlchemy - PullRequest
0 голосов
/ 09 июня 2019

Многие учебные пособия говорят о создании приложения с Flask(__name__), и оттуда мы можем инициализировать базу данных с SQLAlchemy(app).Однако мне не нравится эта навязчивая модель, поскольку самому приложению не нужно ничего знать о базе данных.

Я думаю, что лучшим подходом было бы создание модуля с именем database и инициализация базы данных.

Модели должны import db from database, а приложение должно просто импортировать модели.

Однако при таком подходе модуль базы данных должен каким-то образом извлекать глобальное приложение, с чем я не согласен.

Есть ли способ инициализации базы данных без импорта основного приложения?

1 Ответ

0 голосов
/ 09 июня 2019

Это самый простой способ настроить приложение для фляги:
В 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 в расширениях, но тогда, на мой взгляд, он будет менее чистым.

Чтобы использовать I, я затем импортирую БД из файла расширений.

...