当数据库需要改变的时候,Flask-SQLAchemy从models文件中创建数据库表的时候,是在数据库表不存在的情况下新建,如果改变的话,只有通过删除原有旧的数据库表,但这样会导致原来数据的全部丢失。
比较好的解决办法是使用database migration框架,类似于一个版本控制工具,可以用来追踪源码文件的改变,即可以使用扩展库Flask-Migrate扩展。
安装
pip install flask-migrate
初始化方式
from flask_migrate import Migrate,MigrateCommand
migrate = Migrate(app,db)
manager.add_command('db',MigrateCommand)
则创建迁移库的时候可以通过命令
python hello.py db init
今天启动项目时出现了问题
sqlalchemy.exc.InvalidRequestError: Table 'users' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.
初步怀疑没有构建迁移库造成的,然后照样例代码添加后依然报错,上网搜了下
网上搜到的解决方式:
在__tablename__下面加
__table_args__ = {'extend_existing': True}
然后又报错
RuntimeError: Working outside of application context.
解决方式:
在app/init.py文件中,修改:
def create_app(config_name):
app=Flask(__name__)
+with app.app_context():
app.config.from_object(config[config_name])
config[config_name].init_app(app)
db.init_app(app)
from app.api import api as api_blueprint
app.register_blueprint(api_blueprint,url_prefix='/api/v1')
return app