python大佬養成計劃----flask_migrate,flask_script

flask_migrate

在使用falsk_sqlalchemy時,採用'db.create_all'在後期修改數據庫表字段的時候,不會自動的映射到數據庫中,必須刪除表,python

而後從新運行'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中加上生成屬性的代碼mysql

# 測試:添加gender屬性
    gender = db.Column(db.BOOLEAN,default=True)

migrate主要屬性

建立遷移倉庫(migrations目錄)sql

python manager.py  db init

讀取類的內容, 生成版本文件, 並無真正在數據庫中添加或刪除;數據庫

python manager.py  db migrate -m "添加性別"

在數據庫中曾刪改;flask

python manager.py  db upgrade

去查看改變的歷史狀態;bootstrap

python manager.py  db history

返回指定的版本狀態;app

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插入外部腳本的功能,使得腳本和系統分開spa

總體框架

首先,建立一個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()

圖片描述

相關文章
相關標籤/搜索