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 的区别

二者都是 过滤函数,但是使用有如下差别:

  1. filter 中需要添加类对象,filter_by不需要

  2. 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查询的更多相关文章

  1. tornado框架基础10-websocket

    websocket 01 长轮询 在网页,我们经常扫码登录,结合之前的学习的知识点,来思考下,前端是如何知道用户在手机上扫码登录了呢? 长轮询:客户端不断的向服务器发送请求 缺点: \1. 开销大 \ ...

  2. tornado框架基础08-sqlalchemy表关系和简单登录注册

    01 一对一表关系 Module 需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails relationship from sqlalchemy.orm imp ...

  3. tornado框架基础06-SQLAlchemy连接数据库

    01 ORM 在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢? 和数据库相关,不同的数据库需要 ...

  4. tornado框架基础11-tornado异步

    01 同步和异步 生活中常常会遇到在超市排队买东西的情况,排在你前面的人没有结算完成,你就无法付账,在计算机中也有类似的情形,一个程序在执行之前,需要等待其他的程序执行完成,大家还能举出其他的例子吗? ...

  5. tornado框架基础02-输入和输出

    01 输出 write bytes类型 class IndexHandler(tornado.web.RequestHandler): def get(self): self.write(b'Torn ...

  6. tornado框架基础01-路由简介

    tornado 小而精 Django 大而全 Web框架 Tornado是一个由Python开发的Web框架 Web服务 利用Tornado,可以快速搭建和一个高性能的Web服务 非阻塞 Tornad ...

  7. tornado框架基础09-cookie和session

    01 cookie 在上节,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢? 有没有什么办法可以让浏览器记住登录信息,下次再次打开 ...

  8. tornado框架基础05-模板继承、UImodul和UImethods

    01 模板继承 父模板​ <html lang="en"> <head>     <meta charset="UTF-8"> ...

  9. tornado框架基础04-模板基础

    01 模板 模板演示 配置路径 在 application 中配置模板文件和静态文件的路径: template_path='templates', static_path='static', 模板 & ...

随机推荐

  1. redis优势

    redis是高性能的key-value内存数据库. 由于是内存型的,所以性能相比磁盘数据库更加优秀. 由于支持丰富的数据类型,相比memcache更受开发者欢迎.列表和整形是最常用的数据类型. 就算对 ...

  2. Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)

    题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...

  3. [WOJ1318]和最大

    题目链接: WOJ1318 题目分析: 首先我们要知道当这是一个线性的序列的时候应该怎么做:最大子序和 这里是线性的,就把数组复制两遍即可 好像有些细节要处理(也可能是我代码写丑了),具体的都在代码里 ...

  4. LCA Codeforces 100685G Gadget Hackwrench

    题目传送门 题意:一棵有向的树,问u到v是否可达 分析:假设是无向树,DFS时正向的权值+1,反向的权值-1,然后找到LCA后判断dep数组和d数组就可以了 /******************** ...

  5. HDU 2828 Lamp 二分图的最大匹配 模型题

    http://acm.hdu.edu.cn/showproblem.php?pid=2828 给定n个灯,m个开关,使得每栈灯亮,前提是控制这栈灯的开关的状态是其中一个.(题目应该都看得懂) 其实我想 ...

  6. webpack采坑十连跳

    4.css.js一同打包进html ---------------- https://www.cnblogs.com/amiezhang/p/9723565.html 依赖内联插件  HtmlWebp ...

  7. 两个已排序数组的合并-C语言

    最近在纸上写一个已排序数组的合并时,花了超过预期的时间.仔细想想,这种要放到毕业找工作那会两下就出来了,原因还在于工作后对基础没有重视,疏于练习. 说开一点,现在搜索引擎的发达确实给问题的解决带来了便 ...

  8. C# 移动开发(Xamarin.Form) Plugin.BLE 蓝牙连接

    随着Xamarin.Form项目接近尾声,仔细一算才发现过来大半年时间了. 期间除了刚开始有闲情写写,现在总算有空来总结一下了. 来先说 Plugin.BLE (https://github.com/ ...

  9. ftp 报错 200 Type set to A

    最近在使用ssis 从ftp服务器抓起文件到本地的时候,发现连接ftp出错 200 Type set to A 解决办法: ftp connection 中 设置UsePassiveMode 为Tru ...

  10. nvidia 的一些命令

    直接在命令行使用 NVIDIA-smi会有问题 首先要确保电脑下了cuda. 然后打开cmd,使用cd命令进入: C:\Program Files\NVIDIA Corporation\NVSMI 然 ...