这是我的迁移文件:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
import models
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + 'C:\\flaskDB\\commBorn3.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
我运行了标准命令:
python app.py db init
python app.py db migrate
python app.py db upgrade
生成的数据库是一个同名的文件,大小与kb大小相同,但只有一个表," alembic_version"其中什么都没有。我试图降级并发现我的所有表都已退回,但它们都是空的。我做错了什么?所有数据隐藏在哪里(文件大小相同)?
答案 0 :(得分:5)
您应始终在migrations/versions
之后创建的db migrate
中检查迁移文件,并在所有内容都正常时执行db upgrade
。
问题是在models.py
中您从“普通”应用导入db = SQLAlchemy(app)
实例,而不是从迁移脚本导入。因此,在迁移脚本中,您实际上没有定义任何模型,这就是它删除数据库中所有表的原因。
解决方案很简单:只需在导入模型时使用迁移脚本的应用程序上下文:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + 'C:\\flaskDB\\commBorn3.db'
db = SQLAlchemy(app)
# Import database models with app context
with app.app_context():
from models import *
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()