资讯专栏INFORMATION COLUMN

python大佬养成计划----flask_migrate,flask_script

YacaToy / 1058人阅读

摘要:它可以在每次修改模型后,可以将修改的字段映射到数据库中用户名唯一且不能为空测试添加属性指定该列信息是唯一的当已经生成数据库表和时,并且表中包含数据时。

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()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44911.html

相关文章

发表评论

0条评论

最新活动
阅读需要支付1元查看
<