flask数据库操作-flask_sqlalchemy(2) - 让人又爱又恨的数据查询

数据查询是数据库常规操作的四大龙头之一,既然想要享受查出数据时的喜悦,必然要经受数据查询语句的洗礼。胖胖奉上一份查询语句小总结。


这里做了一个简单的表,插入了一些数据,创建数据表可看上篇书书:浅谈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. 查询单个数据 - get
# 查询id为25的用户信息
person = Person.query.get(25)
print(person)
print(person.nickname, person.gender, person.age)

单个查询.png

get方法只能通过id查询,使用较少

2. 查询所有数据 - all
# 查询所有用户信息
person_list = Person.query.all()
print(person_list)
for person in person_list:
    print(person.nickname, person.gender, person.age)

查询所有数据得到的是一个列表,要通过for循环将其列出

3.查询当前的部分数据 - 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)

这里胖胖想想强调filter_byfilter的些许区别

  • filter_by适合简单的、按照字段进行固定值的查询,比如:性别为男
  • filter适合比较复杂的查询,比如:比较、模糊、聚类
  • 不知道大家发现没有,filter_by和filter都查询了条件性别为男,但是一个用了=,另一个用了==,在使用时千万要注意哦
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()方法限制返回的条数
  • .offset()方法规定查询的起始位置
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
  • 通过上面的代码和图片对比发现,order_by默认升序排列,但是通过设置.desc()方法进行降序排列
7.聚合查询 ( 敲黑板 )

聚合查询常用的方法有MaxMincountsumavg
但是需要注意的是使用聚合方法需要引入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
# 查询男性用户和女性用户的数量
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多条件查询得到的是并列关系,但是sqlalchemy有专门的逻辑查询模块,只要在导入就可以使用啦

  • 导入模块语句
from sqlalchemy import and_
from sqlalchemy import or_
from sqlalchemy import not_
  • 并列也可以通过filter体现,取反也可以通过不等于体现,这里胖胖以or_来举例
# 查询所有赵姓同事或者女同事
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)









结语:

还是要勤加练习,眼过千遍不如手过一遍。一直在路上,奥利给。


如有不妥,欢迎指正

你可能感兴趣的:(flask数据库操作-flask_sqlalchemy(2) - 让人又爱又恨的数据查询)