python中flask_migrate,flask_script的使用介紹(附代碼)

本篇文章給大家?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()
.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刃麸,一起剝皮案震驚了整個濱河市醒叁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖把沼,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啊易,死亡現(xiàn)場離奇詭異,居然都是意外死亡饮睬,警方通過查閱死者的電腦和手機(jī)租谈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捆愁,“玉大人割去,你說我怎么就攤上這事≈绯螅” “怎么了劫拗?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長矾克。 經(jīng)常有香客問我页慷,道長,這世上最難降的妖魔是什么胁附? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任酒繁,我火速辦了婚禮,結(jié)果婚禮上控妻,老公的妹妹穿的比我還像新娘州袒。我一直安慰自己,他們只是感情好弓候,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布郎哭。 她就那樣靜靜地躺著,像睡著了一般菇存。 火紅的嫁衣襯著肌膚如雪夸研。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天依鸥,我揣著相機(jī)與錄音亥至,去河邊找鬼。 笑死贱迟,一個胖子當(dāng)著我的面吹牛姐扮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衣吠,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茶敏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缚俏?” 一聲冷哼從身側(cè)響起惊搏,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贮乳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胀屿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡包雀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年宿崭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片才写。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡葡兑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赞草,到底是詐尸還是另有隱情讹堤,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布厨疙,位于F島的核電站洲守,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沾凄。R本人自食惡果不足惜梗醇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撒蟀。 院中可真熱鬧叙谨,春花似錦、人聲如沸保屯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑尺。三九已至竟终,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間切蟋,已是汗流浹背衡楞。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敦姻,地道東北人瘾境。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像镰惦,于是被迫代替她去往敵國和親迷守。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容