本篇文章給大家?guī)淼膬?nèi)容是關(guān)于python中flask_migrate,flask_script的使用介紹(附代碼)蓝角,有一定的參考價值叔磷,有需要的朋友可以參考一下,希望對你有所幫助哼蛆。
flask_migrate
在使用falsk_sqlalchemy時东帅,采用'db.create_all'在后期修改數(shù)據(jù)庫表字段的時候,不會自動的映射到數(shù)據(jù)庫中巩踏,必須刪除表秃诵,
然后重新運(yùn)行'db.create_all' 才會重新映射。這樣不符合我們的要求塞琼,因此flask-migrate就是為了解決
這個問題菠净。它可以在每次修改模型(class)后,可以將修改的字段映射到數(shù)據(jù)庫中
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()
當(dāng)已經(jīng)生成數(shù)據(jù)庫表user和todo時彪杉,并且表中包含數(shù)據(jù)時毅往。此時,要求我們對數(shù)據(jù)庫表添加屬性(用戶性別)派近,且不影響用戶使用攀唯,我們使用數(shù)據(jù)庫遷移migrate的方式來處理,在原始數(shù)據(jù)庫操作文件model中加上生成屬性的代碼
# 測試:添加gender屬性
gender = db.Column(db.BOOLEAN,default=True)
migrate主要屬性
創(chuàng)建遷移倉庫(migrations目錄)
python manager.py db init
讀取類的內(nèi)容, 生成版本文件, 并沒有真正在數(shù)據(jù)庫中添加或刪除;
python manager.py db migrate -m "添加性別"
在數(shù)據(jù)庫中曾刪改;
python manager.py db upgrade
去查看改變的歷史狀態(tài);
python manager.py db history
返回指定的版本狀態(tài);
python manager.py db downgrade base
管理數(shù)據(jù)庫變更
新建manage.py文件來管理數(shù)據(jù)庫變更
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 '添加用戶性別'
出現(xiàn)語句:Detected added column 'user.gender'渴丸,表明對model有所改動
3.數(shù)據(jù)庫升級
python manager.py db upgrade
生成數(shù)據(jù)庫歷史版本的py文件:Running upgrade -> 202a710ebeb6, '添加用戶性別'
flask_script
Flask Script擴(kuò)展提供向Flask插入外部腳本的功能,使得腳本和系統(tǒng)分開
整體框架
首先革答,創(chuàng)建一個Python模板運(yùn)行命令腳本,可起名為script.py
在該文件中曙强,必須有一個Manager實(shí)例残拐,Manager類追蹤所有在命令行中調(diào)用的命令和處理過程的調(diào)用運(yùn)行情況
Manager只有一個參數(shù)——Flask實(shí)例
from flask_script import Command,Manager
from flask import Flask
app = Flask(__name__)
manager = Manager(app)
if __name__ == '__main__':
manager.run()
創(chuàng)建命令
其次,創(chuàng)建并加入命令碟嘴。
有三種創(chuàng)建命令的方式溪食,即創(chuàng)建Command子類、使用@command修飾符娜扇、使用@option修飾符
第一種--創(chuàng)建Command子類
子類必須定義一個run方法
創(chuàng)建Hello命令错沃,并將Hello命令加入Manager實(shí)例
class Hello(Command):
"""歡迎信息"""
def run(self):
print('hello,sheen')
manager.add_command('hello',Hello)
第二種——使用Command實(shí)例的@command修飾符
@manager.command
def add_user():
"""添加用戶信息"""
print('添加用戶成功')
第三種——使用Command實(shí)例的@option修飾符
建議使用@option;雀瓢,可以傳入有多個參數(shù)
@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()