2-4-flask框架-擴展-數據庫遷移-使用flask-migrate進行數據庫的管理,非常方便!!!


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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM