flask-script&flask-migrate使用
一、简介
Flask-script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell、设置数据库的脚本、cronjobs及其他运行在web应用之外的命令行任务,使得脚本和系统分开而Flask-migrate是一个数据库表结构迁移插件,可对数据库进行无缝表结构变化歉意,并能和flask-script配合使用。
二、flask-script使用
安装:
pip3 install Flask-Script
创建命令并执行
这里我们新建一个py文件名称为manage.py,一个简单栗子我们加入打印hello功能,此时的脚本比较简单可以使用@manager.command进行修饰:
#!/usr/bin/env python3 # -*- coding:utf-8 -*- # Author:wd from flask import Flask from flask_script import Manager app=Flask(__name__) manager = Manager(app) @app.route('/') def index(): return 'index' @manager.command def hello(): print("hello") if __name__ == '__main__': manager.run()
我们可以先通过—help查看其命令列表,默认会加一个shell和runserver命令,shell则是带有flask上下文的环境,可以方便进行调试,而runserver就是运行flask
此时在运行命令 python3 manage.py hello 就会打印hello:
要创建这样的离线脚本命令方式有很多种:
方式一:使用Command子类的方式,该方式需要定义一个run方法,用于运行脚本或者命令。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- # Author:wd from flask import Flask from flask_script import Manager,Command,Option app=Flask(__name__) manager = Manager(app) @app.route('/') def index(): return 'index' class mysql(Command): # 命令定义类 def get_options(self): # 为命令添加参数 return [ Option('-p', '--password', dest='password', default='1234',), #参数可以通过-p指定也可以通过—password,dest代表参数值的接受者 Option('-u', '--username', dest='name', default='root'), ] def run(self, name,password): # 定义几个参数run 方法接受几个参数 print("mysql pass:",name,password) manager.add_command('mysql', mysql()) if __name__ == '__main__': manager.run()
运行:
方式二:
采用函数运行脚本,我们将上述的代码改为函数运行:
#!/usr/bin/env python3 # -*- coding:utf-8 -*- # Author:wd from flask import Flask from flask_script import Manager app = Flask(__name__) manager = Manager(app) @app.route('/') def index(): return 'index' @manager.option('-u', '--username', dest='name', help='mysql user', default='root') @manager.option('-p', '--password', dest='password', help='mysql pass',default='1234') def mysql(name, password): print('mysql pass:', name, password) if __name__ == '__main__': manager.run()
三、flask-migrate结合flask-script使用
安装
pip install Flask-Migrate
简单示例
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate,MigrateCommand from flask_script import Manager app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI']="mysql+pymysql://root:1234qwer@10.1.210.33:3306/devops?charset=utf8" app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True db = SQLAlchemy(app) migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand) class User(db.Model): # 如果model在别的文件定义了需要导入到该文件 id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128)) if __name__ == '__main__': manager.run()
初始化
python3 manage.py db init #该命令会在当前目录下生成一个migrations文件夹,用于记录变更的版本信息
生成版本的迁移
python3 manage.py db migrate
#该命令会在此命令会在migrations下生成一个version文件夹,下面包含了对应版本的数据库操作py脚本以及创建数据库中版本表alembic_version。
数据库更新
python3 manage.py db upgrade
#执行了version文件夹下的相应py版本,对数据库进行变更操作。 #以后的model变化,只要重复migrate和upgrade即可。