2

这是我的迁移文件:

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”,其中没有任何内容。我试图降级,发现我所有的桌子都回来了,但它们都是空的。我做错了什么?所有数据隐藏在哪里(文件大小相同 kb)?

4

1 回答 1

7

migrations/versions您应该始终检查在created after中的迁移文件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()
于 2015-11-25T11:07:55.040 回答