美文网首页
python中flask_migrate,flask_scrip

python中flask_migrate,flask_scrip

作者: 记事本的记事本 | 来源:发表于2019-05-09 16:09 被阅读0次

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

    相关文章

      网友评论

          本文标题:python中flask_migrate,flask_scrip

          本文链接:https://www.haomeiwen.com/subject/bmowoqtx.html