Flask(4)


模型-(Models)

一、什么是模型

     模型,是根據數據庫中表的結構而創建出來的class。
     每一張表對應到編程語言中,就是一個class
     表中的每一個列對應到編程語言中就是class中的一個屬性。

二、模型的框架 - ORM

1、什么是ORM

         ORM :Object Relational Mapping
         簡稱:ORM,O/RM ,O/R Mapping
         中文名:對象關系映射

2、ORM的三大特征

     1、數據表(table)到編程類(class) 的映射
          數據庫中的每一張表 對應到 編程語言中,都有一個類
          在ORM中:
                允許將數據表 自動 生成一個類
                允許將類 自動 生成一張數據表
     2、數據類型的映射
          將數據庫表中的字段以及數據類型 對應到 編程語言中類的屬性
           在ORM中:
               允許將表中的字段和數據類型自動映射到編程語言中
               也允許將類中的屬性和數據類型也自動映射到數據庫表中
     3、關系映射
           將數據庫中表與表之間的關系 對應 到編程語言中類與類之間的關系
           數據庫中表與表之間的關系:
                 1、一對一:
                     外鍵,主鍵關聯,外鍵需要加唯一約束
                     A表中的一條數據只能與B表中的一條數據相關聯
                     (使用外鍵約束 外加 唯一約束)
                 2、一對多:
                     外鍵,主鍵關聯
                     A表中的一條數據可以與B表中的任意多條數據相關聯,反之,B表中的一條數據只能與A表中一條數據相關聯
                     ex:老師(Teacher)與課程(Course)
                         一門課程可以被多個老師所教授
                         一個老師最多只能教一門課程
                     (在“多”對表中增加外鍵 ,引用‘一’表中的主鍵)
                 3、多對多:
                     通過第三張關聯表去關聯兩張表
                     A表中的一條數據可以與B表中的任意多條數據相關聯,B表中的一條數據也可以與A表中的任意多條數據相關聯
                     (通過第三張關聯表來完成的關聯關系)

3、ORM優點

       1、封裝了數據庫中的所有操作,大大提高了開發效率
       2、可以省略龐大的數據訪問層,即便不用SQL編碼也能完成對數據的CRUD操作

三、Flask 中的 ORM框架

1、數據庫 和 框架配置

    在Python 和 Flask 中,使用的ORM框架是 - SQLAlchemy
    在Flask 中想使用 SQLAlchemy的話,需要進行安裝:
          1、查看安裝列表:pip3 list
          2、安裝 SQLAlchemy
               pip3 install sqlalchemy
               pip3 install flask-sqlalchemy

2、創建數據庫

   手動創建: create database flask default charset utf8 collate utf8_general_ci;

3、配置數據庫

 1 from flask import Flask
 2 #將SQLAlchmey模塊導入進來
 3 from flask_sqlalchemy import SQLAlchemy
 4 
 5 app = Flask(__name__)
 6 #為app指定數據庫的配置信息
 7 app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:123456@localhost:3306/flask'
 8 #創建SQLAlchemy的實例,並將app指定給實例
 9 #db是SQLAlchemy的實例,表示的是程序正在使用的數據庫,同時db也具備SQLAlchemy中的所有功能
10 db = SQLAlchemy(app)
11 
12 @app.route('/')
13 def index():
14     return "Hello World"
15 
16 if __name__ == "__main__":
17     app.run(debug=True)
配置數據庫.py

四、定義模型

1、模型:

    數據庫中的表在編程語言中的體現,其本質就是一個Python 的類(可稱為:模型類 或 實體類)。類中的屬性要與數據庫表中的列相對應

2、創建語法:

         class MODELNAME(db.Model):
             __tablename__ = "TABLENAME"
             COLUMN_NAME = db.Column(db.TYPE,OPTIONS)

          1.MODELNAME:定義模型類的名稱,根據表名設定
          2.TABLENAME:映射到數據庫中表的名字
          3.COLUMN_NAME:屬性名,映射到表中列的名字
          4.TYPE:映射到列的數據類型
          5.OPTIONS:列選項

    db.TYPE 列類型如下:
             類型名           python類型                     說明
             Integer            int                        普通整數,32位
             SmallInternet    int                        小范圍整數,通常16位
             BigInteger        int或long                不限精度整數
             Float               float                     浮點數
             Numeric           decimal.Decimal      定點數
             String              str                       變長字符串
             Text                str                       變長字符串,優化
             Unicode           unicode                 變長Unicode字符串
             UnicodeText     unicode                  優化后的變長Unicode串
             Boolean           bool                       布爾值
             Date               datetime.date          日期
             Time               datetime.time          時間
             DateTime         datetime.datetime    日期和時間

    OPTIONS 列選項:
             選項名                  說明
             primary_key   設置為True則表示該列為主鍵
             unique          設置為True則表示該列值唯一
             index            設置為True則表示該列要創建索引,默認為False
             nullable         設置為True則表示該列允許為空,默認是允許為空(True)
             default          為該列定義默認值

    練習:
           1.創建 Student 模型類
                 表名 : student
                 字段:
                     1.id,主鍵,自增
                     2.sname ,長度為30並且不允許為空的字符串
                     3.sage,年齡,整數
           2.創建 Teacher 模型類
                 表名 :teacher
                 字段:
                     1.id,主鍵,自增
                     2.tname,姓名,長度為30並且不許為空的字符串
                     3.tage,年齡,整數
           3.創建 Course 模型類
                 表名:course 
                 字段:
                     1.id ,主鍵,自增
                     2.cname,課程名稱,長度為30並且不允許為空的字符串

五、數據庫操作 - 插入

1.創建實體對象

2.完成插入

      db.session.add(Models實體對象)
       手動提交:
             db.session.commit()
       自動提交:
             app.config['SQLACHEMY_COMMIT_ON_TEARDOWN']=True
             作用:指定執行完成操作后自動提交,
             寫在 app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:123456@localhost:3306/flask' 下面
       # 刪除已創建的表結構
           db.drop_all()
       # 將創建好的實體類映射回數據庫
           db.create_all()

六、數據庫操作 - 查詢

1、基於 db.session 進行查詢

   1.db.session.query()
         該函數會返回一個Query對象,類型為 BaseQuery,該對象中包含了指定實體類對應的表中所有的數據

         該函數可以接收一個或多個參數,參數們表示的是要查詢的實體對象是誰
   2.查詢執行函數
         目的:在查詢的基礎上得到最終想要的結果
         語法:db.session.query(...).查詢執行函數()
         函數                     說明
         all()               以列表的方式返回query中所有的查詢函數結果
         first()             返回查詢中的第一個結果,如果沒有結果,則返回None
         first_or_404()   返回查詢中的第一個結果,如果沒有結果的話,則終止並返回404
         count()           返回查詢結果的數量
         ex:# 查詢執行函數 -all
             users = db.session.query(Users).all()
   3.查詢過濾器函數
         作用:在查詢的基礎上,篩選部分行數據(增加篩選條件)
         語法:db.session.query(Models).過濾器函數(條件).查詢執行函數()
         過濾器函數:               說明
         filter()            按指定條件進行過濾(多表,單表,定值,不定值..)
         filter_by()       按等值條件過濾時使用
         limit()             按限制行數獲取
         order_by()      根據指定條件進行排序
         group_by()      根據指定條件進行分組
       過濾器函數詳解:
          1、filter()
                     注意:條件必須由 模型類.屬性 構成
               1、查詢年齡 大於 30 的Users 的信息
                     db.session.query(Users).filter(Users.age>30).all()
               2、查詢年齡大於30 並且 id大於1 的Users的信息
                     db.session.query(Users).filter(Users.age>30,Users.id > 1).all()
               3、查詢年齡大於30 或者 id大於1 的Users的信息
                   注意:查詢 或 的操作,要借助於 or_()
                     db.session.query(Users).filter(or_(Users.age>30,Users.id > 1)).all()
                     db.session.query(Users).filter(or_(條件1,條件2)).all()
               4、查詢id為2的Users的信息
                   注意:等值判斷必須使用 ==
                     db.session.query(Users).filter(Users.id==2).all()
               5.查詢 email 中包含 'w' 的Users的信息 - 模糊查詢
                   注意:模糊查詢 like 需要使用實體類中屬性提供的like()
                     db.session.query(Users).filter(Users.email.like('%w%')).all()
               6、查詢 id 在 [2,3] 之間的 Users 的信息
                   注意:模糊查詢 in 需要使用實體類中屬性提供的in_([])
                     db.session.query(Users).filter(Users.id.in_([2,3])).all()
          2、filter_by()
                 查詢 id=5的Users的信息
                     db.session.query(Users).filter_by(id=5).all()
          3、limit()
              參數:offset代表:偏移量(跳過)
                在整個查詢結果中獲取前5條數據   
                   db.session.query(Users).limit(5).all()
                使用limit 和offset 查詢限制行數據
                   db.session.query(Users).limit(5).offset(1).all()
          4、order_by()
              參數:asc升序,desc降序
                對Users表中所有的數據按id降序排序
                     db.session.query(Users).order_by('id desc').all()
                按照age列的值降序排序,二級排序按照id升序排序
                     db.session.query(Users).order_by("age desc,id asc").all()
                使用 order_by 排序,先按照年齡升序排列,(年齡相同)再按照id降序排列
                     result = db.session.query(Users).order_by("age asc,id desc").all()
          5、group_by()
                 db.session.query(Users).group_by('age').all()
          6、聚合函數(sun max min count等...)
                 db.session.query(func.聚合函數(Models.Column).label('別名')).all()
               注意:Models.Column:為數據庫名.列名
               ex:查詢Users中所有的age的總和 - 聚合函數
                   result = db.session.query(func.sum(Users.age)).all()
              聚合函數:   
                 sum(): 求和      count(): 求數量      avg():平均值   
                 max():最大值    min():最小值   

2、基於Models 類進行查詢

    Models.query.查詢過濾器函數(條件參數).查詢執行函數()
    參數:Models為數據庫名

七、數據庫操作 - 刪除

1、查詢出要刪除的實體對象

    u=db.session.query(Models).filter_by(xxx).first()
    ex:
         user=db.session.query(Users).filter_by(id=5).first()

2、根據所提供的刪除方法將信息刪除

    db.session.delete(u)
        注意:真正的刪除並不是通過刪除操作完成,而是通過修改完成的

八、修改

    例如:將 id 為1 的用戶的 username 改為 Wang WC ,年齡改為 40

1、查

    將 要修改的信息查詢出來
       user = Users.query.filter_by(id=1).first()

2、改

    實體對象.屬性 = 值
       user.username = "Wang WC"
       user.age = 40

3、保存

    db.session.add(實體對象)
       db.session.add(user)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM