首頁 > 後端開發 > Python教學 > python中flask_migrate,flask_script的使用介紹(附程式碼)

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

不言
發布: 2018-11-15 15:01:02
轉載
3228 人瀏覽過

這篇文章帶給大家的內容是關於python中flask_migrate,flask_script的使用介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

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
登入後複製

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

#管理資料庫變更

新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()
登入後複製

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

以上是python中flask_migrate,flask_script的使用介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板