视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python中flask_migrate,flask_script的使用介绍(附代码)
2020-11-27 14:11:36 责编:小采
文档

本篇文章给大家带来的内容是关于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()

下载本文
显示全文
专题