首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask-Migrate首次迁移时未检测到架构更改

Flask-Migrate首次迁移时未检测到架构更改
EN

Stack Overflow用户
提问于 2018-08-10 17:27:37
回答 10查看 16.1K关注 0票数 18

我将Flask与Flask-SQLAlchemy和Flask-Migrate一起使用来创建应用程序,但是当我尝试创建迁移时,什么也没有发生。

我在app/models.py中创建了两个表

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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,它会创建迁移目录和所有必要的文件,输出如下:

代码语言:javascript
复制
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 migrate时,alembic无法检测到我在app/models.py中有表。我得到以下输出:

代码语言:javascript
复制
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.py重命名为flasktutor.py,并重新运行export FLASK_APP='flasktutor.py'。随后,迁移工作完美地进行了。

请解释一下,当文件名为app.py,而我使用的是export FLASK_APP='app.py'时,为什么迁移没有注册对模式的更改。

EN

回答 10

Stack Overflow用户

发布于 2019-12-05 04:38:30

我遇到了这个问题,并通过在下面的注释之后立即在env.py的migrations文件夹中导入我的模型来解决它

代码语言:javascript
复制
# 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
票数 18
EN

Stack Overflow用户

发布于 2018-09-05 17:34:54

请确保你已经导入了你的模型(导师,学生,...)在你的migrate.init_app(app, db)之前

票数 11
EN

Stack Overflow用户

发布于 2020-01-30 21:06:18

这就是我如何解决我的问题的:

from flask_migrate import Migrate

  • Initiate migrate = Migrate(app, db)

  • Comment db.create_all()

  • Drop导入数据库模型:
  1. Migratemigrate = Migrate(app, db)
  2. Commentdb.create_all()
  3. Drop your database now => => it => export FLASK_APP=name_app.py
  4. Run flask db migrate

  1. Migrate Migrate =>export FLASK_APP=name_app.py
  2. Runflask db migrate

注意:应该使用第六步,以防出现以下错误:

代码语言:javascript
复制
Error: Could not locate a Flask application

希望这能帮助到一些人。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51783300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档