Миграция колб не проходит - PullRequest
       5

Миграция колб не проходит

0 голосов
/ 26 сентября 2019

Я делаю миграции во Flask, используя неудивительно Flask-Migrate.как только я выполняю python manage.py db init, он создает каталог migrations с исходным файлом миграции.Затем я выполняю python manage.py db migrate и получаю следующее:

...
...
target_metadata = current_app.extensions['migrate'].db.metadata
AttributeError: 'NoneType' object has no attribute 'metadata'

Из этого вывода я понимаю, что 'migrate' равен None, следовательно, я получаю ошибку атрибута.

модели.py:

from sqlalchemy.sql import func
from project import db, bcrypt


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(128), nullable=False, unique=True)
    email = db.Column(db.String(128), nullable=False, unique=True)
    password = db.Column(db.String(255), nullable=False)
    active = db.Column(db.Boolean(), default=True, nullable=False)
    created_date = db.Column(db.DateTime, default=func.now(), nullable=False)

    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.password = bcrypt.generate_password_hash(password).decode()

    def to_json(self):
        return {
            'id': self.id,
            'username': self.username,
            'email': self.email,
            'active': self.active,
        }

Вопрос в том, почему ему ничего не передают?Я следую учебному пособию, и у меня не должно быть этой ошибки.

Я получил это из аналогичной темы:

NoneType означает, что вместо экземпляра чего-либоКласс или объект, с которым вы думаете, что работаете, у вас на самом деле есть None.Обычно это означает, что приведенное выше назначение или вызов функции не удался или дал неожиданный результат.

Это то, что я нашел в файле env.py в каталоге миграции:

from flask import current_app
config.set_main_option('sqlalchemy.url',
                       current_app.config.get('SQLALCHEMY_DATABASE_URI'))
target_metadata = current_app.extensions['migrate'].db.metadata

current_app импортируется из Flask, но не содержит расширения migrate, из которого мне нужно использовать метаданные.

Нет причин для того, чтобы он выбрасывал None, хотя, посколькурасширение правильно инициализируется в __init__.py файле:

...
...
from flask_migrate import Migrate

db = SQLAlchemy()
toolbar = DebugToolbarExtension()
cors = CORS()
migrate = Migrate()
bcrypt = Bcrypt()

def create_app(script_info=None):
    app = Flask(__name__)
    app_settings = os.getenv('APP_SETTINGS')
    app.config.from_object(app_settings)
    app.config.from_object('project.config.DevelopmentConfig')
    toolbar.init_app(app)
    cors.init_app(app)
    db.init_app(app)
    migrate.init_app(app)     #  <--
    bcrypt.init_app(app)

    from project.api.users import users_blueprint
    app.register_blueprint(users_blueprint)

    @app.shell_context_processor
    def ctx():
        return {'app': app, 'db': db}

    return app

1 Ответ

0 голосов
/ 26 сентября 2019

У меня отсутствовал аргумент при инициализации расширения migrate.Миграция принимает app экземпляр и экземпляр db.

def create_app(script_info=None):
    app = Flask(__name__)
    app_settings = os.getenv('APP_SETTINGS')
    app.config.from_object(app_settings)
    app.config.from_object('project.config.DevelopmentConfig')
    toolbar.init_app(app)
    cors.init_app(app)
    db.init_app(app)
    migrate.init_app(app, db)     #  <--
    bcrypt.init_app(app)

    from project.api.users import users_blueprint
    app.register_blueprint(users_blueprint)

    @app.shell_context_processor
    def ctx():
        return {'app': app, 'db': db}

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