数据查询是数据库常规操作的四大龙头之一,既然想要享受查出数据时的喜悦,必然要经受数据查询语句的洗礼。胖胖奉上一份查询语句小总结。
这里做了一个简单的表,插入了一些数据,创建数据表可看上篇书书:浅谈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)
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-by
和filter
# 查询所有的男性用户
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_by
和filter
的些许区别
- 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)
5.限制查询 - limit
和offset
# 查询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)
# 从查询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)
- 通过上面的代码和图片对比发现,
order_by
默认升序排列,但是通过设置.desc()
方法进行降序排列
7.聚合查询 ( 敲黑板 )
聚合查询常用的方法有Max
、Min
、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)
8. 分组查询 - group_by
# 查询男性用户和女性用户的数量
from sqlalchemy import func
result = db.session.query(
Person.gender,
func.count(Person.id),
).group_by(Person.gender).all()
print(result)
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)
结语:
还是要勤加练习,眼过千遍不如手过一遍。一直在路上,奥利给。
如有不妥,欢迎指正