flask數據庫遷移
使用flaskSQLAlchemy的問題
- 如果數據庫里已經有A表了,然后在A類中添加字段,是不會更新添加到A表中的。
怎么更新字段
- 因此我們需要進行數據庫的更新,可以使用flask的擴展包migrate
安裝
- pip install Flask-Script
- pip install flask-migrate
PS: 注意了 Flask-Migrate 是要依賴 Flask-Script 組件的
運行報錯解決
報錯:ModuleNotFoundError:No module named ‘flask._compat’
方法一
原因分析:
ModuleNotFoundError: No module named 'flask._compat
ctrl+左鍵 查看manager查看源碼,找到from flask._compat import text_type這行,
按ctrl進行查看,顯示找不到文件,Flask 2.0.0版本修改了。
Flask版本過高問題:flask里面的 ._compat.py文件沒有,降低版本即可。
方法二:
或者
不使用Flask-Script,使用flask命令如下:
初始化數據庫:flask db init
遷移新更改:flask db migrate
升級:flask db upgrade
還有其它命令...
方法三:
參考<https://www.cjavapy.com/article/1977/>
不降級則可以嘗試修改一下flask_script/__init__.py中
from ._compat import text_type 改成 from flask_script._compat import text_type 。
使用
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = Flask(__name__)
# 創建數據庫sqlalchemy工具對象
db = SQLAlchemy(app)
# 創建flask腳本管理工具對象
manager = Manager(app)
# 創建數據庫遷移工具對象
Migrate(app, db)
# 向manager對象中添加數據庫操作命令
manager.add_command('db', MigrateCommand)
示例:這是一個文件:manager.py
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = Flask(__name__)
# create database db_flask default charset utf8 collate utf8_general_ci;
class Config(object):
"""配置參數"""
SQLALCHEMY_DATABASE_URI = "mysql://root:123456@127.0.0.1:3306/db_flask"
# 設置sqlalchemy自動跟蹤數據庫
SQLALCHEMY_TRACK_MODIFICATIONS = True
SECRET_KRY = '#%*(_)?./DFVDjnd34534'
app.config.from_object(Config)
# 創建數據庫sqlalchemy工具對象
db = SQLAlchemy(app)
# 創建flask腳本管理工具對象
manager = Manager(app)
# 創建數據庫遷移工具對象
Migrate(app, db)
# 向manager對象中添加數據庫操作命令
manager.add_command('db', MigrateCommand)
# 創建數據庫模型類
class Role(db.Model):
"""用戶角色表"""
__tablename__ = 'tbl_roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True)
# 需要手動添加,方便使用Role.user查詢用戶對象,user列不是真實存在的,backref="role"為了方便通過User.role獲取角色對象,
# 因為使用User.role_id只能獲取到角色id,要想獲取角色對象,還需要再在Role表中查詢一次
users = db.relationship("User", backref="role")
def __repr__(self):
"""定義之后,可以讓顯示對象的時候更直觀,類似於Django中的__str__"""
return "Rloe object: name=%s" % self.name
class User(db.Model):
"""用戶表"""
__tablename__ = 'tbl_users' # 指明數據庫表名
id = db.Column(db.Integer, primary_key=True) # 整型主鍵,會默認設置為自增主鍵
name = db.Column(db.String(64), unique=True)
email = db.Column(db.String(128), unique=True)
password = db.Column(db.String(128), nullable=False) # nullable=False 參數必須傳
role_id = db.Column(db.Integer, db.ForeignKey("tbl_roles.id"))
if __name__ == '__main__':
# 通過manager對象啟動程序
manager.run()
命令
實際應用的操作步驟,參考如下:
1.python manager.py db init
-- 運行這個命令之后會產生一個migrations文件夾
2.python manager.py db migrate -m"版本名(注釋)"
python manager.py db migrate # 也可以不加注釋
-- 運行這個命令之后會在migrations文件夾的versions里面產生一個版本的py文件
3.python manager.py db upgrade 然后觀察表結構
-- 這一步就是執行的問題了,運行這個執行變更
根據需求修改模型
1.python manager.py db migrate -m"新版本名(注釋)"
2.python manager.py db upgrade 然后觀察表結構
若返回版本,則利用
python manager.py db history 查看版本號
python manager.py db downgrade(upgrade) 版本號
開啟debug
啟Debug模式
通過Flask-Script接管后無法直接通過app.run(debug=True)來開啟Debug了,其實通過Flask-Script也可以很方便開啟Debug模式。
修改之前的代碼:
from flask.ext.script import Manager, Server
app = Flask(__name__)
manager = Manager(app)
manager.add_command("runserver", Server(use_debugger=True))
if __name__ == "__main__":
manager.run()