1 查詢集 : 指數據查詢的集合 1. 原始查詢集: 不經過任何過濾返回的結果為原始查詢集 2. 數據查詢集: 將原始查詢集經過條件的篩選最終返回的結果 查詢過濾器: | 過濾器 | 功能 | | | | | cls.query.filter(類名.屬性名 條件操作符 條件) | 過濾特定條件,返回 ...
1 查詢集 : 指數據查詢的集合
- 原始查詢集: 不經過任何過濾返回的結果為原始查詢集
- 數據查詢集: 將原始查詢集經過條件的篩選最終返回的結果
查詢過濾器:
過濾器 | 功能 |
---|---|
cls.query.filter(類名.屬性名 條件操作符 條件) | 過濾特定條件,返回的是query對象 |
cls.query.filter_by(關鍵字參數對) | 單條件查詢,條件必須關鍵字參數,而且and連接 |
cls.query.offset(num)/查詢集對象.offset(num) | 針對filter查詢集對象偏移 |
cls.query.limit(num) | 針對查詢集取兩條數據 |
cls.query.order_by(屬性名).limit(num) cls.query.order_by( -屬性名).limit(num) |
按屬性名排序,取limit(num) 升序排列 按屬性名排序,取limit(num) 降序排列 |
cls.query.groupby() | 原查詢分組,返回新查詢 |
查詢執行函數
查詢執行方法 | 說明 |
---|---|
cls.query.all() | 所有的數據查詢集,返回對象列表,不能鏈式調用 |
cls.query.first() | 取第一個 |
cls.query.get(值) User.query.get(10) | 取得id的值對應的數據 |
cls.query.filter().count() | 返回查詢結果數量 |
cls.query.filter().paginate() | 返回paginate對象,此對象用於分頁 |
cls.query.filter(類名.屬性名.like('%值%')) | like模糊查詢 |
cls.query.filter(類名.屬性名.contains('值')) | contains包含某個值 |
cls.query.filter(User.username.startswith('張')) | startswith 以...開頭/endswith以...結尾 |
cls.query.filter(User.id.in_([list])) | in_ 和 not in 是否包含某個範圍內 |
cls.query.filter(User.id.is_(None)) | is_ isnot 查詢為null/不為null 的數據 |
2 查詢過濾器實例
(1) all() 得到所有的數據查詢集 返回列表
類名.query.all() 不能夠鏈式調用
@view.route('/all/')
def all():
data = User.query.all()
print(data)
return '刪除數據'
(2) filter() 過濾預設查詢所有
類名.query.filter()
類名.query.filter(類名.屬性名 條件操作符 條件)
#filter 獲取所有數據查詢集
@view.route('/filter/')
def filter():
# data = User.query.filter()
# data = User.query.filter(User.username=='王五')
data = User.query.filter(User.username=='王五',User.sex==False)
print(data)
for i in data:
print(i.username,i.sex)
return '刪除數據'
(3) filter_by() 單條件查詢
@view.route('/filter_by/')
def filter_by():
# data = User.query.filter_by()
data = User.query.filter_by(age=18)
#只能為下麵這種關鍵字的用法 且多個添加為and操作
# data = User.query.filter_by(username='王五',sex=False)
(4) offset(num) 偏移量
@view.route('/offset/')
def offset():
# data = User.query.filter().offset(1)
# data = User.query.filter().offset(2)
#錯誤的用法
data = User.query.all().offset(2)
# print(User.query.filter())
# print(data)
# for i in data:
# print(i.username,i.sex)
return '刪除數據'
(5) limit() 取值
@view.route('/offsetlimit/')
def offsetlimit():
data = User.query.offset(2).limit(2)
print(data)
for i in data:
print(i.username,i.sex)
return 'limit'
(6) order_by() 排序
- 預設升序
- -屬性名
@view.route('/orderby/')
def orderby():
#升序
data = User.query.order_by(User.age).limit(1)
#降序
data = User.query.order_by(-User.age).limit(1)
3 查詢執行函數
(1) first() 取出一條數據
@view.route('/first/')
def first():
# data = User.query.first() == User.query.get(1)
# data = User.query.order_by(-User.age).first()
data = User.query.order_by(User.age).first()
print(data.age)
print(data.username)
# for i in data:
# print(i.username,i.sex)
(2) get() 取得id值的數據
查詢成功 返回 對象
查詢失敗 返回 None
data = User.query.get(10) #找到id=10的數據
print(data)
(3) contains 包含關係
類名.query.filter(類名.屬性名.contains('值'))
data = User.query.filter(User.username.contains('五'))
(4) like 模糊查詢
類名.query.filter(類名.屬性名.like('%值%'))
data = User.query.filter(User.username.like('%張%')) #包含張
data = User.query.filter(User.username.like('%張')) #以張作為結尾
data = User.query.filter(User.username.like('張%')) #以張作為開頭
(5) startswith 以...開頭 endswith以...結尾
data = User.query.filter(User.username.startswith('張')) #以 張作為開頭
data = User.query.filter(User.username.endswith('張')) #以張作為結尾
(6) 比較運算符
1. __gt__ 大於
2. __ge__ 大於等於
3. __lt__ 小於
4. __le__ 小於等於
5. > <
6. >= <=
7. != ==
data = User.query.filter(User.id>1) #查詢id大於1的數據
data = User.query.filter(User.id.__gt__(1)) #查詢id大於1的數據
data = User.query.filter(User.id.__ge__(1)) #查詢id大於1的數據
data = User.query.filter(User.id>=1) #查詢id大於1的數據
data = User.query.filter(User.id<3) #查詢id大於1的數據
data = User.query.filter(User.id.__lt__(3)) #查詢id大於1的數據
(7) in_ 和 not in 是否包含某個範圍內
#in的使用
@view.route('/in/')
def myin():
data = User.query.filter(User.id.in_([1,2,3,4])) #在...範圍內
data = User.query.filter(~User.id.in_([1,2,3,4])) #not in不再...範圍內
data = User.query.filter(User.username.in_(['張三','王五']))
return render_template('show.html',data=data)
(8) is_ / isnot 查詢為null/不為null 的數據
#對於null數據的處理
@view.route('/null/')
def null():
#查詢為null數據的
data = User.query.filter(User.username.is_(None))
data = User.query.filter(User.username == None)
data = User.query.filter(~User.username.isnot(None))
#查詢不為null數據的
data = User.query.filter(~User.username.is_(None))
data = User.query.filter(User.username.isnot(None))
data = User.query.filter(User.username != None)
return render_template('show.html',data=data)
(9) count 統計
@view.route('/count/')
def mycount():
#統計性別為sex的數據條數
data = User.query.filter(not_(User.sex == True)).count()
#統計所有數據的條數
data = User.query.filter().count()
data = User.query.count()
return '{}條數據'.format(data)
4 資料庫邏輯查詢
from sqlalchemy import and_,or_,not_
(1) 邏輯與 and_
#邏輯操作
@view.route('/and/')
def myand():
data = User.query.filter(User.sex==True,User.age<20)
data = User.query.filter(User.sex==True).filter(User.age<20)
data = User.query.filter(and_(User.sex==True,User.age<20))
return render_template('show.html',data=data)
(2) 邏輯或 or_
#邏輯操作
@view.route('/or/')
def myor():
#or
data = User.query.filter(or_(User.sex==True,User.age<20),User.id.in_([1,2,3]))
#and 和 or的 一起使用
data = User.query.filter(or_(User.sex==True,User.age<20))
return render_template('show.html',data=data)
(3) 邏輯非 not_
#邏輯操作
@view.route('/not/')
def mynot():
data = User.query.filter(not_(User.sex==True))
#錯誤寫法只能有一個條件
data = User.query.filter(not_(User.sex==True,User.id!=1))
data = User.query.filter(~User.sex==True)
return render_template('show.html',data=data)
5 flask-migrate 文件的遷移
安裝:
flask-script
flask-migrate
使用
from flask_migrate import Migrate,MigrateCommand
migrate = Migrate(app,db) #將app與db進行關聯
manager = Manager(app)
manager.add_command('db',MigrateCommand) #給manage添加遷移文件的命令db
(1) 生成遷移文件目錄
python3 manage.py db init
生成 一個 migrations
的遷移文件目錄
(2) 生成遷移文件
python3 manage.py db migrate
(3) 執行遷移文件
python3 manage.py db upgrade