Как автоматически создавать таблицы базы данных и схемы с Flask и Sqalchemy? - PullRequest
1 голос
/ 26 марта 2020

У меня небольшое Flask приложение. Я добавляю дополнительный уровень безопасности для входа в систему. Мой рефакторинг основан на статье DO .

В двух словах:

__init__.py:

from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash
from sqlalchemy import create_engine

# init SQLAlchemy so we can use it later in our models
db = SQLAlchemy()

def create_app():
    app = Flask(__name__)

    app.config['SECRET_KEY'] = 'e56432f4402c9a0c166fe6c6a0a2fbbd'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'

    db.init_app(app)

        # blueprint for auth routes in our app
    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint)

    # blueprint for non-auth parts of app
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    login_manager = LoginManager()
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app)

    from .models import User

    @login_manager.user_loader
    def load_user(user_id):
        # since the user_id is just the primary key of our user table, use it in the query for the user
        return User.query.get(int(user_id))

    return app

Для создания БД мне нужно запустить в REPL:

  from project import db, create_app
  db.create_all(app=create_app())

Это неудобно и затрудняет Docker создание изображения. Я запускаю приложение как flask run. Я видел подобные проблемы, но не понимаю, как применить к моему сценарию.

Как мне преодолеть это осложнение?

ОБНОВЛЕНИЕ 1:

Структура моего проекта следующая :

project/
  project/
    __init__.py
    auth.py
    main.py
    models.py
    static/
    templates/
  Dockerfile
  requirements.txt

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Я нашел более элегантное решение

Вместо return app сделайте следующий блок, чтобы приложение создавалось во время выполнения тогда и только тогда, когда контекст был инициализирован и база данных создана.

with app.app_context():
        db.create_all()
        return app

Удивительно, но Flask-SqlAlchemy указывает на создание базы данных REPL в качестве первого решения, а не на указанное выше.

0 голосов
/ 27 марта 2020

Если вы хотите, чтобы база данных создавалась при запуске приложения flask:

, я бы поместил этот код

def createMyDatabase():
    from project import db, create_app
    db.create_all(app=create_app())

в файл makedatabase.py и сохранил его в каталог вашей программы root. Затем добавьте from <path to makedatabase.py>/makedatabase import createMyDatabase в начало вашего __init__.py файла, а затем сразу после операторов импорта в __init__.py напишите createMyDatabase(). Я думаю, что это был бы самый простой способ сделать это в вашей ситуации.

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

Вы можете просто возьмите функцию из файла makedatabase.py, а затем запустите файл в том же виде, в каком он был до запуска приложения flask.

...