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

posted @ 2021-11-08 19:55  技术改变命运Andy  阅读(949)  评论(0编辑  收藏  举报