模型-(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)
四、定義模型
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)
