當數據庫需要改變的時候,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