python中flask_migrate,flask_script的使用介绍(附代码)

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

    """添加用户信息"""

[图片上传失败...(image-f65604-1557389318256)]

    print('添加用户成功')


@manager.option('-n','--name',help='删除用户')

def del_user(name):

    """删除用户信息"""


    if name:
        print('删除用户%s成功' %(name))
    else:
        print('用户名为空!')
if __name__ == '__main__':
    manager.run()
.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容