最近用到了SQLAlchemy来做一个web程序的数据库,在这里记录一下怎么查询数据(新手向)。
通过对模型类的 query 属性调用可选的过滤方法和查询方法,我们就可以获取到对应的单个或多个记录(记录以模型类实例的形式表示)。查询语句的格式如下:
<模型类>.query.<过滤方法(可选)>.<查询方法>
下面是一些常用的查询方法:
查询方法 | 说明 |
all() | 返回包含所有查询记录的列表 |
first() | 返回查询的第一条记录,如果未找到,则返回None |
get(id) | 传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回None |
count() | 返回查询结果的数量 |
first_or_404() | 返回查询的第一条记录,如果未找到,则返回404错误响应 |
first_or_404() | 传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回404错误响应 |
paginate() | 返回一个Pagination对象,可以对记录进行分页处理 |
例:假如我有一个User表
<模型类>.query.<查询方法>
User.query.all() #User表所有的记录
User.query.first() #User表第一条记录
User.query.get(1) #User表id1的记录
用起来很方便,但是这样的查询还是不够实用。想要更细致的查询,就需要用到过滤方法。
下面是一些常用的过滤方法:
过滤方法 | 说明 |
filter() | 使用指定的规则过滤记录,返回新产生的查询对象 |
filter_by() | 使用指定规则过滤记录(以关键字表达式的形式),返回新产生的查询对象 |
order_by() | 根据指定条件对记录进行排序,返回新产生的查询对象 |
group_by() | 根据指定条件对记录进行分组,返回新产生的查询对象 |
例:假如我有一个Worker表,列名分别为uid(主键)、name、age、sex。
<模型类>.query.<过滤方法>.<查询方法>
Worker.query.filter_by(sex = '男').first() #性别为男的第一条记录
Worker.query.filter(Worker.name == '张三').all() #所有名字为张三的记录
Worker.query.filter(Worker.age > '18').all() #所有年龄大于18的记录
filter_by
和filter
都是过滤条件,只是用法有区别,filter_by
里面不能用!=
还有> <
等等,filter_by
只能用=
。所以filter
更灵活,用得更多
相比单条件,多个条件的查询会更加常用,当然组合也会更复杂:
Worker.query.filter_by(sex = '女', age = '18').all()# 年龄为18的女性
Worker.query.filter(or_(Worker.name == '张三', Worker.age > 58)).all()#张三或年龄大于58岁的记录
Worker.query.filter(or_(Worker.age < 6, Worker.age > 58), Worker.name != '张三').all()#年龄小于6岁或大于58岁且名字不为张三的记录
filter()
里面的条件默认是使用 AND 进行连接,所以对and_
进行了省略。
我们还可以限制返回结果,对返回结果进行排序:
User.query.limit(2).all() #限制返回条数为二
User.query.offset(2).all() #从第三条开始返回
User.query.slice(2,3).all() #截取第二到第三条
from sqlalchemy import desc
User.order_by(User.id).query.limit(2).all() #根据id排序,获取前两条记录
比如我们需要获取名为张三的最新一条记录:
User.query.filter(User.username!='张三').order_by(desc(User.id)).limit(1).all()
order_by
默认是顺序排列,加上desc
就表示逆序
我的笔记到这里就结束了,后面还有模糊查询、多表查询等没有学习,毕竟我做的小网页还用不上这些。