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

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

不言
不言轉載
2018-11-15 15:01:023198瀏覽

這篇文章帶給大家的內容是關於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刪除