tornado框架基础07-sqlalchemy查询
01 查询结果
上节使用query从数据库中查询到了结果,但是query返回的对象是直接可用的吗?
首先导入模块
from connect import session
from user_modules import User
query**返回对象**
rs = session.query(User).filter(User.username=='budong')
print(rs, type(rs))
根据返回结果来看, rs 是一个 Query 对象,打印出来可以看到转化的 SQL语句
使用 SQLAlchemy 时,如果想要查看最终在数据库中执行的 sql ,可以通过上述方式来查看
all
session.query(User).filter(User.username=='budong').all()
all 是返回所有符合条件的数据
first
session.query(User).filter(User.username=='budong').first()
first 是返回所有符合条件数据的第一条数据
[0]
session.query(User).filter(User.username=='budong')[0]
[0] 和 first 类似,但是如果没有符合条件的数据则会报错
取值方式
rs = session.query(User).filter(User.username=='budong').all()
getattr(rs[0], 'username'), rs[0].username这两种方式可以取到具体的数据值
all
session.query(User.username).filter(User.username=='budong').all()
这里,在 query 中查询对象的某个属性值 ( 对应为查询表中某个字段的值 ),返回的结果不再是一个Query 对象,而是一个列表
first
session.query(User.username).filter(User.username=='budong').first()
同理,但是 first 返回结果是一个元组
[0]
session.query(User.username).filter(User.username=='budong')[0]
[0] 和 first 类似,但是如果没有符合条件的数据则会报错
返回对象
必须掌握:不同查询方式,返回对象的区别。如果是整表查询则返回 Module的一个实例;如果是查询某个属性,返回的则是具体的数据
返回结果取值
必须掌握:不同的返回结果,取值方式也会有所区别,如果是 Module 实例,需要通过属性访问的方式取值,同时也要注意 all 和 first 返回的结果的区别
02 条件查询
在实际的工作中,查询的时候会有很多的要求,通过不同的条件筛选出精准的数据,那在SQLAlchemy中该如何进行条件查询呢?
过滤函数
filter
session.query(User).filter(User.username=='budong').all()
filter 是一个过滤函数,过滤条件都可以书写在此函数中,不同的条件之间用 逗号 分隔
filter_by
session.query(User).filter_by(username='budong').all()
filter_by 也是一个过滤函数,但是功能要弱一些
filter 和 filter_by 的区别
二者都是 过滤函数,但是使用有如下差别:
filter 中需要添加类对象,filter_by不需要
filter_by 中只能添加等于的条件,不能添加 不等于、大于小于等条件,filter没有这个限制
模糊查询
like 和 notlike
session.query(User.id).filter(User.username.like('budong%')).all()
session.query(User.id).filter(User.username.notlike('budong%')).all()
like 是模糊查询,和数据库中的 like 用法一样
notlike 和 like 作用相反
in_ 和 notin_
session.query(User.id).filter(User.username.in_(['budong', 'tuple'])).all()
session.query(User.id).filter(User.username.notin_(['budong', 'tuple'])).all()
in_ 和 notin_ 是范围查找
is_ 和 isnot_
session.query(User.id).filter(User.username.is_(None)).all()
session.query(User.id).filter(User.username.isnot(None)).all()
判断为空还可以使用:
session.query(User.id).filter(User.username==None).all()
is_ 和 isnot 精确查找
查询结果数
all
session.query(User.username).filter(User.username!='budong').all()
先用 all 查看所有的数据
limit
session.query(User.username).filter(User.username!='budong').limit(2).all()
limit 查看前两条数据
offset
session.query(User.username).filter(User.username!='budong').offset(1).all()
offset 偏移一条记录
slice
session.query(User.username).filter(User.username!='budong').slice(1,3).all()
slice 对查询出来的数据进行切片取值
one
session.query(User.username).filter(User.username=='tuple').one()
one 查询一条数据,如果存在多条则报错
排序
导入
fromsqlalchemy import desc
order_by
session.query(User.username).filter(User.username!='budong').order_by(User.id).all()
order_by 对查询出来的结果进行排序,默认是顺序
desc
session.query(User.username).filter(User.username!='budong').order_by(desc(User.username)).all()
desc 是倒序排序
order_by 和 limit
session.query(User.username).filter(User.username!='budong').order_by(User.username).limit(3).all()
order_by 和 limit 一起使用的时候,可以通过如上方式
函数
导入
from sqlalchemy import func,extract
func.count
session.query(User.password,func.count(User.id)).group_by(User.password).all()
使用函数时,需要导入 func, group_by 和 order_by 一样,是可以直接使用的,不需要导入
func.count
session.query(User.password, func.count(User.id)).group_by(User.password).having(func.count(User.id)>1).all()
having 也可以直接使用,使用方法也和 SQL 中使用类似
聚合函数
func.sum
session.query(User.password, func.sum(User.id)).group_by(User.password).all()
sum 求和
func.max
session.query(User.password, func.max(User.id)).group_by(User.password).all()
max 求最大值
func.min
session.query(User.password, func.min(User.id)).group_by(User.password).all()
min 求最小值
ctrl点func查看源码中的函数
函数
extract
session.query(extract('minute',User.creatime).label('minute'), func.count(User.id)).group_by('minute').all()
extract 提取对象中的数据,这里提取分钟,并把提取出来的结果用 label 命名别名,之后就可以使用 group_by 来分组
extract
session.query(extract('day',User.creatime).label('day'), func.count('*')).group_by('day').all()
count 里面同样可以使用 *
这里只是给出一个演示实例,如果在今后需要使用其他的函数,导入即可
选择条件
导入
from sqlalchemy import or_
and_ or_
session.query(User.username).filter(or_(User.username.isnot(None), User.password=='qwe123')).all()
or_ 是或者的意思,和数据库中的 or 一样
03 多表查询
新建 Module
from sqlalchemy import ForeignKey
class UserDetails(Base):
tablename='user_details' id = Column(Integer, primary_key=True, autoincrement=True)
id_card = Column(Integer,nullable=True,unique=True)
last_login = Column(DateTime)
login_num = Column(Integer,default=0)
user_id = Column(Integer,ForeignKey('user.id'))
def repr(self):
return '<UserDetails(id=%s,id_card=%s,last_login=%s,login_num=%s,user_id=%s)>'%( self.id, self.id_card, self.lost_login, self.login_num, self.user_id )
导入
from user_modules import UserDetails
cross join
session.query(UserDetails,User)
通过打印的 SQL 来看,这种是 cross join,笛卡尔积
示例
session.query(UserDetails, User).filter(UserDetails.id==User.id).all()
inner join
session.query(User.username, UserDetails.lost_login).join(UserDetails,UserDetails.id==User.id)
通过打印的 SQL 来看,上面这种方式是 inner join
示例
session.query(User.username,UserDetails.lost_login).join(UserDetails,UserDetails.id==User.id).all()
left join
session.query(User.username,UserDetails.lost_login).outerjoin(UserDetails,UserDetails.id==User.id)
通过上面打印的 SQL 来看, 上面这种方式采用的是left join
示例
session.query(User.username,UserDetails.lost_login).outerjoin(UserDetails,UserDetails.id==User.id).all()
union
q1 = session.query(User.id)
q2 = session.query(UserDetails.id)
q1.union(q2).all()
union 是联合查询,有自动去重的功能,对应的还有 union_all
子表查询
声明子表
sql_0 = session.query(UserDetails.lost_login).subquery()
subquery 声明子表
使用
session.query(User, sql_0.c.lost_login).all()
注意:子表使用时要注意使用方法 .c属性访问子表列名,column,
04 原生SQL查询
SQLAlchemy 虽然可以不用担心SQL问题,但有些情况下难免看上去比较麻烦,这个时候用原生的SQL会更加方便,这个可以实现吗?
SQL
sql_1=''' select * from `user` #注意表名用反引号,数字1左边。 '''
查询
row = session.execute(sql_1)
取值
row.fetchone()
row.fetchmany()
row.fetchall()
循环取值
for i in row:
print(i)
sql的执行顺序,
在mysql里面,from,join,where,....最后select,sql优化还需要进一步学习
tornado框架基础07-sqlalchemy查询的更多相关文章
- tornado框架基础10-websocket
websocket 01 长轮询 在网页,我们经常扫码登录,结合之前的学习的知识点,来思考下,前端是如何知道用户在手机上扫码登录了呢? 长轮询:客户端不断的向服务器发送请求 缺点: \1. 开销大 \ ...
- tornado框架基础08-sqlalchemy表关系和简单登录注册
01 一对一表关系 Module 需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails relationship from sqlalchemy.orm imp ...
- tornado框架基础06-SQLAlchemy连接数据库
01 ORM 在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢? 和数据库相关,不同的数据库需要 ...
- tornado框架基础11-tornado异步
01 同步和异步 生活中常常会遇到在超市排队买东西的情况,排在你前面的人没有结算完成,你就无法付账,在计算机中也有类似的情形,一个程序在执行之前,需要等待其他的程序执行完成,大家还能举出其他的例子吗? ...
- tornado框架基础02-输入和输出
01 输出 write bytes类型 class IndexHandler(tornado.web.RequestHandler): def get(self): self.write(b'Torn ...
- tornado框架基础01-路由简介
tornado 小而精 Django 大而全 Web框架 Tornado是一个由Python开发的Web框架 Web服务 利用Tornado,可以快速搭建和一个高性能的Web服务 非阻塞 Tornad ...
- tornado框架基础09-cookie和session
01 cookie 在上节,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢? 有没有什么办法可以让浏览器记住登录信息,下次再次打开 ...
- tornado框架基础05-模板继承、UImodul和UImethods
01 模板继承 父模板 <html lang="en"> <head> <meta charset="UTF-8"> ...
- tornado框架基础04-模板基础
01 模板 模板演示 配置路径 在 application 中配置模板文件和静态文件的路径: template_path='templates', static_path='static', 模板 & ...
随机推荐
- springcloud(二) 负载均衡器 ribbon
代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo ribbon是一个负载均衡客户端 类似nginx反向代理,可 ...
- ufunc函数
无灯可看.雨水从教正月半.探茧推盘.探得千秋字字看. 铜驼故老.说著宣和似天宝.五百年前.曾向杭州看上元. ufunc是universal function的缩写,他是一种对数组的每个元素进行运算的函 ...
- Zookeeper(1、3、5节点)集群安装
1节点 1 week110的zookeeper的安装 + zookeeper提供少量数据的存储 3节点 hadoop-2.6.0.tar.gz的集群搭建(3节点) hadoop-2.6.0-cdh5. ...
- [Usaco2012 Jan]Video Game
Description Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the ...
- Educational Codeforces Round 20 B
Description You are given the array of integer numbers a0, a1, ..., an - 1. For each element find th ...
- web 前端的一些问题
1. HTML 和 JS 一个网页显示出来的静态的内容为html创见的静态object 对这些object的操作通过JS来响应 2. HTTP cookie cookie是由server set, 由 ...
- 130 Surrounded Regions 被围绕的区域
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O), 找到所有被 'X' 围绕的区域.并将区域里所有 'O'用 'X' 填充.例如,X X X XX O O XX X O XX O X X运行你 ...
- Spark MLlib编程API入门系列之特征选择之向量选择(VectorSlicer)
不多说,直接上干货! 特征选择里,常见的有:VectorSlicer(向量选择) RFormula(R模型公式) ChiSqSelector(卡方特征选择). VectorSlicer用于从原来的特征 ...
- PHP生成和获取XML格式数据
在做数据接口时,我们通常要获取第三方数据接口或者给第三方提供数据接口,而这些数据格式通常是以XML或者JSON格式传输,本文将介绍如何使用PHP生成XML格式数据供第三方调用以及如何获取第三方提供的X ...
- gbk编码文件传输json实例
cline.php <?php $str='此地无银三百两'; $str = iconv('gbk', 'utf-8', $str); //Json只支持utf-8编码,如果不进行转码的话,服务 ...