【发布时间】:2019-01-17 21:07:18
【问题描述】:
我将 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 migrate 时,alembic 无法检测到我在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.py 重命名为 flasktutor.py 并重新运行 export FLASK_APP='flasktutor.py'。随后迁移工作完美。
请有人解释为什么当文件被称为 app.py 而我使用 export FLASK_APP='app.py' 时,迁移没有注册对架构的更改。
【问题讨论】:
-
您还必须更改其他内容。我有一个名为 app.py 的应用程序,我用它来测试 Flask-Migrate,它运行良好。如果你有一个完整的例子来说明这个问题,如果你能分享它将会很有用。
-
我也有同样的问题,但我的文件名为 run.py。我将其更改为 app.py,然后更改为 phoenix.py,但仍然是同样的问题。在此行上调试应用程序
app.config.from_object(app_config[config_name])我发现当我运行应用程序时,对 config_name 的引用会引发相同的错误。KeyError: <flask.cli.ScriptInfo object at 0x0000000003A11D68>. -
这是我遇到的一个问题,谢谢,这与烧瓶在不同点混合了同名的包和模块导入有关
标签: python python-3.x flask flask-sqlalchemy flask-migrate