最近用到了SQLAlchemy来做一个web程序的数据库,在这里记录一下怎么查询数据(新手向)。
通过对模型类的 query 属性调用可选的过滤方法和查询方法,我们就可以获取到对应的单个或多个记录(记录以模型类实例的形式表示)。查询语句的格式如下:
<模型类>.query.<过滤方法(可选)>.<查询方法>下面是一些常用的查询方法:
查询方法说明all()返回包含所有查询记录的列表first()返回查询的第一条记录,如果未找到,则返回Noneget(id)传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回Nonecount()返回查询结果的数量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就表示逆序
我的笔记到这里就结束了,后面还有模糊查询、多表查询等没有学习,毕竟我做的小网页还用不上这些。