在使用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)
建立遷移倉庫(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插入外部腳本的功能,使得腳本和系統分開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()