Python Web Infrastructure - Flask(2)

#使用Migrate的步驟:
#1. import flask_migrate包
#2. 調用Migrate方法:Migrate(app,db)參數分別是Flask對象和SQLAlchemy對象
#3. 定義環境變量(Windows/Linux):set/export FLASK_APP=ModelClass.py 這個腳本是定義模型類的腳本路徑,一般在當前目錄下定義。
#4. 在命令行執行命令: flask db init 該命令創建歸併目錄,執行一次即可,在執行中會import FLASK_APP指定的腳本,爲避免一級代碼在import中被執行導致的異常,可以放到if __name__塊中。
#5. 在命令行執行命令: flask db migrate -m "執行返回的信息" 改命令創建歸併文件
#6. 在命令行執行命令: flask db upgrade 該命令實際把更新提交到數據庫。

import os
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask import Flask,render_template,url_for,redirect,flash,request

f_instance=Flask(__name__)
f_instance.config['SECRET_KEY']='flasksecret'
    
    
basedir=os.path.dirname(os.path.abspath(__file__))

# Connects our Flask App to our Database
f_instance.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
f_instance.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(f_instance)

class Approvement(db.Model):
    __tablename__='approvements'
    id=db.Column(db.Integer,primary_key=True)
    result=db.Column(db.Text)
    app_id=db.Column(db.Integer)
    app_note=db.Column(db.Text)
    
    def __init__(self,result,app_id):
        self.id = id  #這裏如果不定義self.id,在以後查詢結果對象中無法訪問id屬性。但如果這裏指定了id私有屬性,在向表中添加紀錄時id字段必須要賦值。
        self.result=result
        self.app_id=app_id
        self.app_note="Default"
        
class Application(db.Model):
    __tablename__='applications'
    id=db.Column(db.Integer,primary_key=True)
    note=db.Column(db.Text)
    
    def __init__(self,note):
        #self.id = id #這裏不定義id屬性,在向表中添加紀錄時,由於類中定義了id字段爲主鍵,SQLAlchemy會爲id賦值一個自增值,但查詢結果中無法訪問id屬性。
        self.note=note

 
if __name__=="__main__":

    #db.create_all() #如果不用Migrate,可以直接在指定路徑上創建數據庫(一個文件)並根據本python文件模型類的定義在數據庫中創建表,每個模型類對應一個表。
    #db.create_all() 不用Migrate的話可以用來創建上面所有model類定義的表。但是不能重複執行,所以Migrate更方便一些,

    apl1=Application('my first application')
    
    apl2=Application('my second application')
    
    apv1=Approvement('approvement for apl1',1)
    apv1.id=1
    
    apv2=Approvement('approvement for apl2',2)
    apv2.id=2
    
    
    #db.session.add(apl1)添加一條記錄,會根據記錄的對象類型自動確定添加到哪個表中。
    db.session.add_all([apl1,apl2,apv1,apv2]) #可以同時添加不同表的記錄
    db.session.add_all([apl1,apl2,apv1,apv2]) #重複執行會把舊紀錄覆蓋掉。通過這個特性實現更新操作:先檢索出需要修改的記錄,然後按要求更新對象屬性,最後add到數據庫替換舊紀錄。

    db.session.commit
    
    #查詢表中的內容可以通過模型類的方法:
    apl=Application.query.get(1)
    print(f"get record:{apl.id}-{apl.note}") #因爲apl.id訪問無效,返回異常。
    apls=Application.query.all() #返回一個列表
    print(f"all records:{len(apls)}")
    apvs=Approvement.query.filter_by(id=1).all()
    print(f"filter records:{apvs}")

    #如果只執行數據庫的操作不需要啓動Flask Web 應用。
    #f_instance.run(debug=True)

else:
    #Migrate放到這裏,避免直接執行當前腳本時被調用。因爲我們只希望當前腳本被flask db init命令import時調用Migrate。
    Migrate(f_instance,db) #Migrate用來歸併當前python文件中對數據庫的表結構變更和數據增刪。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章