flask 遷移資料庫工具
在開發過程中,需要修改資料庫模型,而且還要在修改之後更新資料庫,最直接的方式是刪除舊錶,但這樣會丟失資料
更好的就誒接辦法是使用資料庫遷移框架,它可以追蹤資料庫模型的變化,然後把變動應用的資料庫中
在Flask中可以使用Flask-Migrate擴充套件,來實現資料遷移。並且整合到Flask-Script中,所有操作通過命令就能完成
為了到處資料庫遷移命令,Flask-Migrate提供了一個MigrateCommand類,可以附加到flask-script的manager物件上
pip install flask-migrate
由於flask-migrate必須依賴於flask-script,因此需要先在pychon程式中先用flask_scrip建立中Manager物件,整個falsk應用程式都是這個Manager物件幫助我們進行維護
建立database.py 內容如下
# coding:utf-8 from falsk import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate,MigrateCommand from flask_script import Shell,Manager app = Flask(__name__) manager = Manager(app) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[email protected]:3306/Flask_test' app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) # 例項化一個migrate物件 # 第一個引數是Flask的例項,第二個引數是Sqlalchemy資料庫例項 migrate = Migrate(app, db) #manager是Flask-Script的例項,這條語句在flask-Script中新增一個db命令 manager.add_command('db',MigraateCommand) # 定義模型Role class Role(db.Model): # 定義表名 __tablename__ = 'roles' id = db.Column(db.Integer, Primary_key=True) name = db.Column(db.String(64), unique=True) def __repr__(self): return 'Role:'.format(self.name) # 定義使用者 class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True) def __repr__(self): return 'User:'.format(self.username) if __name__ == '__main__': manager.run()
# 這個命令會建立migrations資料夾,所有遷移檔案都放在裡面
python database.py db init
下面對圖書這個專案使用資料庫遷移
# coding:uf-8 from flask import Flask, render_template, request,redirect, url_for, jsonfy from flask_sqlalchemy import SQLAlchemy from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired from flask_migrate import Migrate,MigrateCommand from flask_script import Shell,Manager app = Flask(__name__) class Config(object): SQLALCHEMY_DATABASE_URI = "mysql://root:[email protected]:3306/author_book_py04" # 設定sqlalchemy自動跟蹤資料庫 SQLALCHEMY_TRACK_MODIFICATIONS = True SECRET_KEY = "password" app.config.from_object(Config) # 建立flask指令碼管理工具物件 manager = Manager(app, ) #建立flask管理工具物件 db = SQLAlchemy(app) # 建立資料庫遷移工具物件,不需要例項化一物件名, # 它會自動在維護的時候會載入進app中而且跟db管理到一起 Migrate(app, db) # 向manager物件中新增資料庫的操作命令 # db是新增的命令,MigrateCommand指明db命令是什麼命令 manager.add_command("db",MigrateCommand) # 定義資料庫模型 class Author(db.Model): __tablenale__ = "tbl_authors" id = db.Column(db.Integer,primary_key=True) name = db.Column(db.String(32), unique=True) books = db.relationship("Book", backref="author") class Book(db.Model): __tablename__ = "tbl_books" id = db.Column(db.Integer,primary_key=True) name = db.Column(db.String(64),unique=True) author_id = db.Column(db.Integer,db.ForeignKey("tbl_authors.id")) # 建立表單類 class AuthorbookForm(FlaskForm) author_name = StringField( label='作者', validators=[DataRequired('作者必填')] ) book_name = StringField( label='書籍', validators=[DataRequired('書籍必填')] ) submit = SubmitField( lable="儲存" ) @app.route('/', methods=["POST","GET"]) def index(): # 建立表單物件 form = AuthorBookForm() # 驗證表單 if form.validate_on_submit(): # 提取表單資料 author_name = form.author_name.data book_name = form.book_name.data # 儲存資料庫 author = Author(name=author_name) db.session.dadd(author) db.session.commit() # 有兩種新增書籍作者的方法 # 一個是通過上面建立的authour物件的id新增 # 或通過類author中的backref="author"實現 # book = Book(name=book_name,author_id=author.id) book = Book(name=book_name,author=author) db.session.add(book) db.session.commit() # 查詢資料庫 author_li = Author.query.all() print("author list is %s" % author_li) return render_template("author_book.html", authors=author_li) # 刪除書籍 @app.route('/delete_book',methods=["GET"]) def delete_book(): # 提取引數典 book_id = request.args.get("book_id") # 刪除資料 book = Book.query.get(book_id) db.session.delete(book) db.session.commit() return redirect(url_for("index")) if __name__ == '__main__': # 通manger物件啟動程式 manager.run()
# 在終端中使用
# 初始化操作
python author_book.py db init
# 生成遷移檔案
python author_book.py db migrate
# 生成遷移檔案時新增描述
python author_book.py db migrate -m “遷移描述”
# 更新資料庫
pyton authour_book.py db upgrade
# 檢視升級歷史
python author_book.py db history
# 降級
pyton authour_book.py db downgrade 狀態碼(history中檢視)