首页 > 解决方案 > Flask-Migrate 首次迁移时未检测到架构更改

问题描述

我将 Flask 与 Flask-SQLAlchemy 和 Flask-Migrate 一起使用来创建应用程序,但是当我尝试创建迁移时没有任何反应。

我在以下位置创建了两个表app/models.py

from flask import current_app
from . import db

class Student(db.Model):
    __tablename__ = 'students'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, nullable=False)
    password_hash = db.Column(db.String(128))

    def __init__(self, **kwargs):
        super(Student, self).__init__(**kwargs)

    def __repr__(self):
        return '<Tutor {}>' % self.id

class Tutor(db.Model):
    __tablename__ = 'tutors'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True)
    password_hash = db.Column(db.String(128))

    def __init__(self, **kwargs):
        super(Tutor, self).__init__(**kwargs)
    def __repr__(self):
        return '<Student %r>' % self.id

然后我也有app/__init__.py以下代码:

from flask import Flask
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

#from .models import User, Task, Project, UserProject

from config import config

bootstrap = Bootstrap()
db = SQLAlchemy()
migrate = Migrate()

def create_app(config_name='default'):
    #print config_name.name
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    bootstrap.init_app(app)
    db.init_app(app)
    migrate.init_app(app, db)

    ## Register the main blueprint for main app functionality
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app

app.py

import os
from app import create_app, db
from app.models import Tutor, Student

app = create_app('default')

@app.shell_context_processor
def make_shell_context():
    return dict(db=db, Tutor=Tutor, Student=Student)

我可以flask db init毫无问题地运行,它会创建迁移目录和所有必要的文件,输出如下:

Creating directory /Users/Jasmine/projects/flask/flask-tutoring/migrations ... done
Creating directory /Users/Jasmine/projects/flask/flask-tutoring/migrations/versions ... done
Generating /Users/Jasmine/projects/flask/flask-tutoring/migrations/script.py.mako ... done
Generating /Users/Jasmine/projects/flask/flask-tutoring/migrations/env.py ... done
Generating /Users/Jasmine/projects/flask/flask-tutoring/migrations/README ... done
Generating /Users/Jasmine/projects/flask/flask-tutoring/migrations/alembic.ini ... done
Please edit configuration/connection/logging settings in '/Users/Jasmine/projects/flask/flask-tutoring/migrations/alembic.ini' before proceeding.

但是当我尝试运行flask db migratealembic 时无法检测到我在app/models.py. 我得到以下输出:

INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.env] No changes in schema detected.

没有创建迁移脚本,它好像models.py不存在。

如果这是一个重复的问题,我深表歉意,但我找不到另一个例子,它的第一次迁移失败并且根本没有创建迁移脚本。

我已经尝试通过在 shell 中运行来检查是否已经在某处创建了一个表,db.drop_all()但这似乎不是问题。

更新

我想出了一个自己解决这个问题的方法,但想更好地理解为什么会这样。

我重命名app.pyflasktutor.py并重新运行export FLASK_APP='flasktutor.py'。随后迁移工作完美。

请有人解释为什么当文件被调用app.py并且我使用export FLASK_APP='app.py'迁移时没有注册对架构的更改。

标签: pythonpython-3.xflaskflask-sqlalchemyflask-migrate

解决方案


我遇到了这个问题,并通过env.py在以下评论之后将我的模型导入到迁移文件夹中来解决它

# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata

from app.models import Student, Tutor

推荐阅读