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()
技术改变命运