1. 程式人生 > >Flask資料庫遷移擴充套件 Flask-Migrate 和 Flask-Script

Flask資料庫遷移擴充套件 Flask-Migrate 和 Flask-Script

使用Flsak-Migrate資料庫遷移框架,可以保證資料庫結構在發生變化時,改變資料庫結構不至於丟失資料庫的資料。使用其進行資料庫進行資料庫的遷移,主要分為三個步驟:

1 建立資料倉庫

        首先通過mysql資料庫命令列新建資料庫test.

        然後我們要在test.py中佈置相關環境: 

import os,json
from flask import Flask, render_template, session, redirect, url_for
from flask_script import Manager,Shell
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:
[email protected]
/test?charset=utf8' #app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True manager = Manager(app) db = SQLAlchemy(app) migrate = Migrate(app,db) class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True) age = db.Column(db.String(64)) .... def __repr__(self): return '<User %r>' % self.username def make_shell_context(): return dict(app=app, db=db, User=User) # manager.add_command("shell", Shell(make_context=make_shell_context)) manager.add_command('db', MigrateCommand) if __name__ == '__main__': manager.run()

  


        這裡我們引入了Manager模組用來使啟動flask時支援命令列。首先,分別引入了migrate模組和Manager相關模組;建立了一個manager物件,以支援自定義命令的配置;建立一個Migrate物件並關聯對應的應用程式類物件app和資料庫管理類物件db;最後一行將MigrateCommand命令加入到manager物件中,這樣就可以在命令列中進行資料庫遷移的相關命令.

 

        需要注意的是,引入Manager支援啟動應用程式的命令列時,我們還需要修改app的run語句,改為:

 

if __name__=='__main__':  

  1.     manager.run()  

 

        接下來我們使用命令列模式建立一個遷移的倉庫:

 

>>> python test.py db init  


        'db'是在manager.add_command('db',MigrateComand)這句中我們宣告的命令列物件名稱,init是Migrate命令,表示初始化遷移倉庫,執行完成之後,會在當前目錄下建立一個migrations的資料夾,用於進行遷移的資料庫指令碼都放在這裡.

 

2 建立遷移指令碼

        使用migarate子命令來建立資料庫遷移指令碼,在此之前我們先改動一下資料庫的模型來驗證遷移是否成功,我們在User模型中新增age屬性:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    age = db.Column(db.String(64))我們檢查下是否更新成功:

python test.py db migrate

 

 

3 資料庫更新

 

    python test.py db upgrade

      成功進行了更新。

Flask-Migrate 官方文件:https://flask-migrate.readthedocs.io/en/latest/