最近用到了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_byfilter都是过滤条件,只是用法有区别,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就表示逆序

我的笔记到这里就结束了,后面还有模糊查询、多表查询等没有学习,毕竟我做的小网页还用不上这些。