1. 程式人生 > >flask(4):資料庫

flask(4):資料庫

一,需要的包

flask-SQLAlchemy:用於管理資料庫

flask-script:利用shell命令自動匯入特定物件

flask-Migrate:實現資料庫遷移

自行安裝,命令:pip install XXX

二,ORM

物件關係對映(Object-Relational-Mapping,簡稱ORM)

是一種為了解決面向物件和關係型資料庫存在的互不匹配的現象的技術。

三,flask-SQLAlchemy管理資料庫

SQLAlchemy是一個強大的關係型資料庫框架,支援多種資料庫後臺,不僅提供高層ORM,還支援使用資料庫原生SQL。

flask-SQLAlchemy是一個flask拓展,簡化在flask程式中使用SQLAlchemy的操作。

兩個重要的配置
    SQLALCHEMY_DATABASE_URI(用於連線資料庫)
        postgresql://scott:[email protected]/mydatabas
        mysql://scott:[email protected]/mydatabase
        oracle://scott:[email protected]

:1521/sidname
        sqlite:////absolute/path/to/foo.db
    SQLALCHEMY_TRACK_MODIFICATIONS(如果設定成 True (預設情況),Flask-SQLAlchemy 將會追蹤物件的修改並且傳送訊號。)

例項化:db=SQLAlchemy(app)

四,定義模型

flask-SQLAlchemy建立的資料庫例項為模型提供了一個基類以及一系列輔助類和輔助函式,可用於定義模型的結構。

定義類(模型)
    繼承於db.Model
    類變數__tablename__定義在資料庫中使用的表名
    一個模型,在資料庫中對應一張表

定義類變數(屬性)
    繼承於db.Column
        指定型別
        列選項,例如,是否為主鍵,是否不能重複。

除錯小建議:給每個類定義一個__repr()__方法,用於返回一個具有可讀性的字串表示模型。

五,關係

一對一
    外來鍵關聯
    一端用外來鍵
    另一端的relationship中設定uselist=False

一對多
    外來鍵關聯
    多的一端用外來鍵
    少的一端用反向引用

多對多
    增加關聯表
    變成兩個原表和關聯表之間分別為一對多關係
    兩個原表的relationship中必須制定secondary引數為關聯表

六,資料庫操作

建立表
    db.create_all()
    表名即為之前建立的模型類名
    表已存在時不會更新或重新建立

插入行
    物件=模型名(屬性=具體值),例如(user1=User(name='"小李飛刀"))
        模型的建構函式接收的引數是使用關鍵字引數制定的模型屬性初始值。
    db.session.add(XXX)或db.session.add_all(XXX,XXX,XXX)
        賦值後並未立即寫入資料庫,要使用資料庫會話管理對資料庫所做的改動,會話由db.session表示
    db.session.commit()
        提交會話,將物件寫入資料庫
    1:資料庫會話可以保證資料庫的一致性,當寫入過程發生錯誤時,整個會話都會失敗,可以避免由部分更新導致的資料庫不一致 
    2:資料庫會話可以回滾,db.session.rollback()

修改行
    直接通過屬性更改,例如:user1.name='許三多'
    db.session.add(user1)
    db.commit()

刪除行
    db.session.delete(user1)
    db.commit()

查詢行
    flask-SQLAlchemy為每個模型都提供了query方法
    查詢所有資料:User.query.all()
    使用過濾器精確查詢:User.query.filter_by(Gender='male').all()
    檢視原生SQL,只需將query物件轉化為字串:str(User.query.all())
    有些表示式,可能會進行隱含的查詢,返回隱藏的query物件,需要在關係中配置lazy=“dynamic”,禁止自動查詢,從而可以用query物件,新增過濾器進行精確查詢

常用的SQLAlchemy查詢過濾器
過濾器 說明
filter() 把過濾器新增到原查詢上,返回一個新查詢
filter_by() 把等值過濾器新增到原查詢上,返回一個新查詢
limit 使用指定的值限定原查詢返回的結果
offset() 偏移原查詢返回的結果,返回一個新查詢
order_by() 根據指定條件對原查詢結果進行排序,返回一個新查詢
group_by() 根據指定條件對原查詢結果進行分組,返回一個新查詢
常用的SQLAlchemy查詢執行器
方法 說明
all() 以列表形式返回查詢的所有結果
first() 返回查詢的第一個結果,如果未查到,返回None
first_or_404() 返回查詢的第一個結果,如果未查到,返回404
get() 返回指定主鍵對應的行,如不存在,返回None
get_or_404() 返回指定主鍵對應的行,如不存在,返回404
count() 返回查詢結果的數量
paginate() 返回一個Paginate物件,它包含指定範圍內的結果

七,資料庫遷移

需要的包
    flask-Script
        Shell用於在terminal中匯入例項和模型
        Manager用於跟蹤所有命令但並不處理
    flask-Migrate
        資料庫遷移框架

建立物件及命令
    manager = Manager(app)
    migrate = Migrate(app, db)
    manager.add_command('db', MigrateCommand)
        MigrateCommand類可以附加到flask-Script的manager物件上,本例即為,附加在db命令上

建立遷移倉庫
    python XXXX.py db init
    該命令會自動建立migrations資料夾,所有遷移指令碼都存放其中。
    遷移倉庫中的檔案要和程式的其他檔案一起納入版本控制。

建立遷移指令碼
    python XXXX.py db migrate -m "提示資訊"

更新資料庫
    python XXXX.py db upgrade