flask數(shù)據(jù)庫(kù)操作-flask_sqlalchemy(2) - 讓人又愛(ài)又恨的數(shù)據(jù)查詢

數(shù)據(jù)查詢是數(shù)據(jù)庫(kù)常規(guī)操作的四大龍頭之一,既然想要享受查出數(shù)據(jù)時(shí)的喜悅,必然要經(jīng)受數(shù)據(jù)查詢語(yǔ)句的洗禮。胖胖奉上一份查詢語(yǔ)句小總結(jié)。


這里做了一個(gè)簡(jiǎn)單的表,插入了一些數(shù)據(jù),創(chuàng)建數(shù)據(jù)表可看上篇書書:淺談flask_sqlalchemy(1)

class Person(db.Model):
    """
    用戶表
    """
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(32), unique=True)
    password = db.Column(db.String(32))
    nickname = db.Column(db.String(32), default="")
    age = db.Column(db.Integer, default=18)
    gender = db.Column(db.String(16), default="男")
    photo = db.Column(db.String(32), default="1.jpg")  # 頭像
    phone = db.Column(db.String(32), nullable=True)  # 用戶電話
    email = db.Column(db.String(64), nullable=True)  # 用戶郵箱
    address = db.Column(db.Text, nullable=True)  # 用戶地址
    score = db.Column(db.Float, nullable=True)
1. 查詢單個(gè)數(shù)據(jù) - get
# 查詢id為25的用戶信息
person = Person.query.get(25)
print(person)
print(person.nickname, person.gender, person.age)

單個(gè)查詢.png

get方法只能通過(guò)id查詢,使用較少

2. 查詢所有數(shù)據(jù) - all
# 查詢所有用戶信息
person_list = Person.query.all()
print(person_list)
for person in person_list:
    print(person.nickname, person.gender, person.age)

查詢所有數(shù)據(jù)得到的是一個(gè)列表,要通過(guò)for循環(huán)將其列出

3.查詢當(dāng)前的部分?jǐn)?shù)據(jù) - filter-byfilter
# 查詢所有的男性用戶
person_list = Person.query.filter_by(gender="男")
for person in person_list:
    print(person.nickname, person.gender, person.age)
# 查詢所有的年齡大于20歲的男性用戶
person_list = Person.query.filter(Person.age > 20, Person.gender == "男")
for person in person_list:
    print(person.nickname, person.gender, person.age)

這里胖胖想想強(qiáng)調(diào)filter_byfilter的些許區(qū)別

  • filter_by適合簡(jiǎn)單的、按照字段進(jìn)行固定值的查詢,比如:性別為男
  • filter適合比較復(fù)雜的查詢,比如:比較、模糊、聚類
  • 不知道大家發(fā)現(xiàn)沒(méi)有,filter_by和filter都查詢了條件性別為男,但是一個(gè)用了=,另一個(gè)用了==,在使用時(shí)千萬(wàn)要注意哦
4. 模糊查詢 - like
# 查詢所有年齡大于21歲的張性男同事
person_list = Person.query.filter(
    Person.age > 21,
    Person.gender == "男",
    Person.nickname.like("張%")
)
for person in person_list:
    print(person.nickname, person.gender, person.age)
模糊查詢.png
5.限制查詢 - limitoffset
# 查詢10位年齡小于21歲的女性用戶
person_list = Person.query.filter(
    Person.age < 21,
    Person.gender == "女"
).limit(10)
for person in person_list:
    print(person.nickname, person.gender, person.age)

一般和限制查詢搭配使用的有.offset()方法

# 從第二十位用戶開始查詢10位年齡小于21歲的女性用戶
person_list = Person.query.filter(
    Person.age < 21,
    Person.gender == "女"
).limit(10).offset(20)
for person in person_list:
    print(person.id, person.nickname, person.gender, person.age)
  • .limit()方法限制返回的條數(shù)
  • .offset()方法規(guī)定查詢的起始位置
6.排序查詢 - order_by
# 從查詢10位年齡小于21歲的女性用戶且按年齡升序排列
person_list = Person.query.filter(
    Person.age < 21,
    Person.gender == "女"
).order_by(Person.age)
for person in person_list:
    print(person.id, person.nickname, person.gender, person.age)
升序排列.png
# 從查詢10位年齡小于21歲的女性用戶且按年齡降序排列
person_list = Person.query.filter(
    Person.age < 21,
    Person.gender == "女"
).order_by(Person.age.desc())
for person in person_list:
    print(person.id, person.nickname, person.gender, person.age)
降序排列.png
  • 通過(guò)上面的代碼和圖片對(duì)比發(fā)現(xiàn),order_by默認(rèn)升序排列,但是通過(guò)設(shè)置.desc()方法進(jìn)行降序排列
7.聚合查詢 ( 敲黑板 )

聚合查詢常用的方法有MaxMin、count、sum、avg
但是需要注意的是使用聚合方法需要引入func模塊

from sqlalchemy import func


result = db.session.query(
    func.count(Person.id),
    func.Max(Person.score),
    func.Min(Person.age),
    func.avg(Person.age),
).filter(Person.gender == "男", Person.nickname.like("趙%")).all()
print(result)
截圖參考.png
8. 分組查詢 - group_by
# 查詢男性用戶和女性用戶的數(shù)量
from sqlalchemy import func


result = db.session.query(
    Person.gender,
    func.count(Person.id),
).group_by(Person.gender).all()
print(result)
分組查詢.png
9. 邏輯查詢 - and_ or_ not_

filter多條件查詢得到的是并列關(guān)系,但是sqlalchemy有專門的邏輯查詢模塊,只要在導(dǎo)入就可以使用啦

  • 導(dǎo)入模塊語(yǔ)句
from sqlalchemy import and_
from sqlalchemy import or_
from sqlalchemy import not_
  • 并列也可以通過(guò)filter體現(xiàn),取反也可以通過(guò)不等于體現(xiàn),這里胖胖以or_來(lái)舉例
# 查詢所有趙姓同事或者女同事
person_list = Person.query.filter(
    or_(
        Person.nickname.like("趙%"),
        Person.gender == "女"
    )
)
for person in person_list:
    print(person.id, person.nickname, person.gender, person.age)









結(jié)語(yǔ):

還是要勤加練習(xí),眼過(guò)千遍不如手過(guò)一遍。一直在路上,奧利給。


如有不妥,歡迎指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容