python - 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 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'
迁移时没有注册对架构的更改。
解决方案
我遇到了这个问题,并通过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
推荐阅读
- vaadin - 带有 Bower 组件的 Vaadin 14:找不到模块错误
- php - 从他们的输入中存储将通过搜索查询与其他人共享的大量用户数据的常见做法是什么?
- pyopenssl - 如何在 pyOpenSSL 中使用 SAN 验证域名
- python - AWS Managed Airflow - 如何重新启动调度程序?
- node.js - 将图像上传到 nodejs api 以存储在 mongoDB
- javascript - 如何在 reactstrap 工具提示中插入换行符?
- perl - LWP::Simple 6.53 安装失败
- caching - Hazelcast IMDG 中批量访问与单次访问的性能
- node.js - Multer GridFs 存储关联 req.user 到元数据
- ubuntu - 身份验证 localhost 失败,尽管有 ssh-keys