成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python大佬養(yǎng)成計劃----flask_migrate,flask_script

YacaToy / 1114人閱讀

摘要:它可以在每次修改模型后,可以將修改的字段映射到數(shù)據(jù)庫中用戶名唯一且不能為空測試添加屬性指定該列信息是唯一的當已經(jīng)生成數(shù)據(jù)庫表和時,并且表中包含數(shù)據(jù)時。

flask_migrate

在使用falsk_sqlalchemy時,采用"db.create_all"在后期修改數(shù)據(jù)庫表字段的時候,不會自動的映射到數(shù)據(jù)庫中,必須刪除表,

然后重新運行"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()

當已經(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擴展提供向Flask插入外部腳本的功能,使得腳本和系統(tǒng)分開

整體框架

首先,創(chuàng)建一個Python模板運行命令腳本,可起名為script.py
在該文件中,必須有一個Manager實例,Manager類追蹤所有在命令行中調(diào)用的命令和處理過程的調(diào)用運行情況
Manager只有一個參數(shù)——Flask實例

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實例

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;,可以傳入有多個參數(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():
    """添加用戶信息"""

    print("添加用戶成功")

@manager.option("-n","--name",help="刪除用戶")
def del_user(name):
    """刪除用戶信息"""

    if name:
        print("刪除用戶%s成功" %(name))
    else:
        print("用戶名為空!")
if __name__ == "__main__":
    manager.run()

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44911.html

相關(guān)文章

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<