时间:2021-07-01 10:21:17 帮助过:83人阅读
本篇文章给大家带来的内容是关于python中flask_migrate,flask_script的使用介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
flask_migrate
在使用falsk_sqlalchemy时,采用'db.create_all'在后期修改数据库表字段的时候,不会自动的映射到数据库中,必须删除表,
然后重新运行'db.create_all' 才会重新映射。这样不符合我们的要求,因此flask-migrate就是为了解决
这个问题。它可以在每次修改模型(class)后,可以将修改的字段映射到数据库中
from flask_sqlalchemy import SQLAlchemy from flask import Flask import pymysql from sqlalchemy import desc from flask_bootstrap import Bootstrap app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:sheen@localhost/migrate_sql' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) app.config['SECRET_KEY'] = 'SHEEN' bootstrap = Bootstrap(app) class User(db.Model): id = db.Column(db.INTEGER,autoincrement=True,primary_key=True) # 用户名唯一且不能为空 name = db.Column(db.String(30),unique=True,nullable=False) # 测试:添加gender属性 gender = db.Column(db.BOOLEAN,default=True) todos = db.relationship('Todo',backref='user') class Todo(db.Model): id = db.Column(db.INTEGER, autoincrement=True, primary_key=True) # unique: 指定该列信息是唯一的; name = db.Column(db.String(50)) user_id = db.Column(db.INTEGER,db.ForeignKey('user.id')) if __name__ == '__main__': db.create_all()
当已经生成数据库表user和todo时,并且表中包含数据时。此时,要求我们对数据库表添加属性(用户性别),且不影响用户使用,我们使用数据库迁移migrate的方式来处理,在原始数据库操作文件model中加上生成属性的代码
# 测试:添加gender属性 gender = db.Column(db.BOOLEAN,default=True)
migrate主要属性
创建迁移仓库(migrations目录)
python manager.py db init
读取类的内容, 生成版本文件, 并没有真正在数据库中添加或删除;
python manager.py db migrate -m "添加性别"
在数据库中曾删改;
python manager.py db upgrade
去查看改变的历史状态;
python manager.py db history
返回指定的版本状态;
python manager.py db downgrade base
管理数据库变更
新建manage.py文件来管理数据库变更
from flask_script import Manager from flask_migrate import Migrate, MigrateCommand from models import app,db migrate = Migrate(app,db) manager = Manager(app) manager.add_command('db',MigrateCommand) if __name__ == '__main__': manager.run()
步骤:
1. 初始化(自动生成migrations目录) python manager.py db init 2. 生成最初的迁移 python manager.py db migrate -m '添加用户性别' 出现语句:Detected added column 'user.gender',表明对model有所改动 3.数据库升级 python manager.py db upgrade 生成数据库历史版本的py文件:Running upgrade -> 202a710ebeb6, '添加用户性别'
flask_script
Flask Script扩展提供向Flask插入外部脚本的功能,使得脚本和系统分开
整体框架
首先,创建一个Python模板运行命令脚本,可起名为script.py
在该文件中,必须有一个Manager实例,Manager类追踪所有在命令行中调用的命令和处理过程的调用运行情况
Manager只有一个参数——Flask实例
from flask_script import Command,Manager from flask import Flask app = Flask(__name__) manager = Manager(app) if __name__ == '__main__': manager.run()
创建命令
其次,创建并加入命令。
有三种创建命令的方式,即创建Command子类、使用@command修饰符、使用@option修饰符
第一种--创建Command子类
子类必须定义一个run方法
创建Hello命令,并将Hello命令加入Manager实例
class Hello(Command): """欢迎信息""" def run(self): print('hello,sheen') manager.add_command('hello',Hello)
第二种——使用Command实例的@command修饰符
@manager.command def add_user(): """添加用户信息""" print('添加用户成功')
第三种——使用Command实例的@option修饰符
建议使用@option;,可以传入有多个参数
@manager.option('-n','--name',help='删除用户') def del_user(name): """删除用户信息""" if name: print('删除用户%s成功' %(name)) else: print('用户名为空!')
完整示例
# script.py from flask_script import Command,Manager from flask import Flask app = Flask(__name__) manager = Manager(app) class Hello(Command): """欢迎信息""" def run(self): print('hello,sheen') manager.add_command('hello',Hello) @manager.command def add_user(): """添加用户信息""" print('添加用户成功') @manager.option('-n','--name',help='删除用户') def del_user(name): """删除用户信息""" if name: print('删除用户%s成功' %(name)) else: print('用户名为空!') if __name__ == '__main__': manager.run()
以上就是python中flask_migrate,flask_script的使用介绍(附代码)的详细内容,更多请关注Gxl网其它相关文章!