tornado 07 数据库—ORM—SQLAlchemy—查询

引言

#上节课使用query从数据库查询到了结果,但是query返回的对象是直接可用的吗
#在query.py内输入一下内容

from connect import session
from user_modules import User rs = session.query(User).filter(User.username=='xuchengcheng') #根据返回结果来看,rs是一个query对象,打印出来可以看到转化过后的SQL
# print(rs,type(rs)) print(session.query(User).filter(User.username=='xuchengcheng').all()) #这个返回的是一个list,列表里面是一个类 print(session.query(User).filter(User.username=='xuchengcheng').first()) #这个返回的是一个类的实例化 print(session.query(User)[0]) #索引为0的值,类似于first,但是不等同于,空列表用这个会报错 rs = session.query(User).filter(User.username=='xuchengcheng').all()
# print(rs) 返回的也是一个列表
print(rs[0].username)#列表所以为0的类的实例化,然后用点方法来取出username
print(getattr(rs[0],'username')) #这种方法也可以取出username rs = session.query(User.username).filter(User.username=='xuchengcheng').all()
print(rs) #返回[('xuchengcheng',)],在query里面指定了某个属性值,返回的也就不是一个query对象,而是直接查询User.username的值,所以就返回了包括元组的列表 rs = session.query(User.username).filter(User.username=='xuchengcheng').first()
print(rs) #返回的就是一个元组

二、条件查询

#如何通过不同的条件在SQLAlchemy中实现查询
#过滤函数filter,通俗点讲就是加条件
#filter是一个过滤函数,过滤条件都可以书写在次函数中,不同的条件之间用逗号隔开 session.query(User).filter(User.username=='xuchengcheng').all() #filter_by也是一个过滤函数,但是功能弱一点
session.query(User).filter_by(username='xuchengcheng').all()
#两者区别
#1、filter中需要添加类对象,filter_by不需要
#2、filter_by中只能添加等于的条件,不能添加不等于、大于小于等条件

  快速添加数据

#中间下面download
#1、点击pycharm右边database
#2、点击绿色加号 DataSource--->MySQL
#3、Name自定义 ; Host不变 ;Database(数据库):选择需要操作的数据库 mydb ;User:admin ; Password : 该用户下的密码Root110qwe
#4、test connection 测试连接
#5、apply ----> OK #然后可以通过database里面的schemas里面的mysql快速添加内容了; 记得最后操作完点击绿色 ->DB 保存

  条件查询

#条件查询
rs = session.query(User).filter(User.username=='xuchengcheng') #模糊查询
rs = session.query(User.username).filter(User.username.like('%cheng%')).all() #模糊查询like rs = session.query(User.username).filter(User.username.notlike('%cheng%')).all()#模糊查询notlike #精确查询
rs = session.query(User.username).filter(User.username.is_(None)).all()#精确查询is,需加上 ‘_’ rs = session.query(User.username).filter(User.username.isnot(None)).all() #精确查询isnot #范围查询
rs = session.query(User.username).filter(User.username.in_(['xuchengcheng','zhouzhou'])).all() #范围查找in_ rs = session.query(User.username).filter(User.username.notin_(['xuchengcheng','zhouzhou'])).all()#范围查找notin_ #limit,offset,slice
print(session.query(User.username).limit(3).all()) #从前向后顺序查循前三条
print(session.query(User.username).offset(2).all()) #偏移2个,前面两个数据不看,从第三个数据开始查询
print(session.query(User.username).slice(1,3).all()) #切片,索引1到2的数据
# print(session.query(User.username).filter(User.username=='xuchengcheng').one()) #只能有一个数据,如果有多个xuchengcheng就会报错;可以用来测试是否只有一条 #排序
from sqlalchemy import desc #desc是需要导入的
print(session.query(User.username,User.id).filter(User.username!='xuchengcheng').order_by(User.id).all()) #查询不等于xuchengcheng的username,并且根据id的顺序来排序(通过order_by)
print(session.query(User.username,User.id).filter(User.username!='xuchengcheng').order_by(desc(User.id)).all()) #查询不等于xuchengcheng的username,并且根据id的反序(desc)序来排序
print(session.query(User.username,User.id).filter(User.username!='xuchengcheng').order_by(User.id).limit(2).all()) #限制数量 #函数
from sqlalchemy import func,extract #使用函数需要导入这两个
print(session.query(User.password).group_by(User.password).all()) #分组group_by
print(session.query(User.password,func.count(User.id)).group_by(User.password).all()) #通过func,函数名的方法来使用函数
print(session.query(User.password,func.count(User.id)).group_by(User.password).having(func.count(User.password)>1).all()) #having通常与group_by连用,添加条件 #根据创建时间里面的时间来排序
print(session.query(extract('minute',User.creatime).label('minute'),func.count(User.id)).group_by('minute').all()) #按分钟分组
# extract:从creatime提取出分钟数 label:取别名 group_by:使用别名

三、多表查询

#多表查询
print(session.query(User,UserDetails).filter(UserDetails.id==User.id).all()) #cross join 查询方法
print(session.query(User.username,UserDetails.lost_login).join(UserDetails,UserDetails.id==User.id).filter(UserDetails.id==User.id).all()) #inner join 查询方法
#在mysql里面这两种方法没有区别
print(session.query(UserDetails.lost_login,User.username).outerjoin(User,User.id==UserDetails.id).filter(UserDetails.id==User.id).all()) #outer join 查询方法 #union 联合查询
q1 = session.query(User.id)
q2 = session.query(UserDetails.id)
q1.union(q2).all() #联合查询,有去重的功能 #子表查询
sql_0 = session.query(UserDetails.lost_login).subquery() #subquery声明子表
print(session.query(User,sql_0.c.lost_login)) #使用子表查询

四、原生SQL查询

#SQLAlchemy虽然可以不用担心SQL问题,但有些情况看上去比较麻烦,这些时候用原生SQL会genjia更加方便
#原生SQL查询
sql_1 = """
select * from `user` #这里需要用反引号
"""
row = session.execute(sql_1)
print(row)
print(row.fetchone()) #得到一条
print(row.fetchmany()) #得到一个列表,里面只有一条
print(row.fetchall()) #得到所有
for i in row: #得到所有
print(i)

tornado 07 数据库—ORM—SQLAlchemy—查询的更多相关文章

  1. tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作

    tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作 一. ORM #在服务器后台,数据是要储存在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办?是不 ...

  2. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

  3. 【tips】ORM - SQLAlchemy操作MySQL数据库

    优先(官方文档SQLAlchemy-version1.2): sqlalchemy | 作者:斯芬克斯 推荐一(长篇幅version1.2.0b3):python约会之ORM-sqlalchemy | ...

  4. 07 模型层 orm相关查询 F查询Q查询 django开启事务

    一.Django终端打印SQL语句 如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看 在Django项目的settings.py文件中,在最后复制 ...

  5. python ORM - sqlalchemy 操作使用

    python操作数据库 使用 ORM - sqlalchemy,pymsql 安装: pip install pymsq pip install sqlalchemy 一. '''连接数据库'''   ...

  6. Django学习笔记〇四——数据库ORM的使用(有待修改)

    Django框架基本上都是要和数据库结合使用的,我在以前讲过SQLAlchemy框架的使用,Django支持的不是SQLAlchemy,但是也内嵌了ORM框架,可以不需要直接面对数据库编程,而可以通过 ...

  7. SQLAlchemy04 /SQLAlchemy查询高级

    SQLAlchemy04 /SQLAlchemy查询高级 目录 SQLAlchemy04 /SQLAlchemy查询高级 1.排序 2.limit.offset和切片操作 3.懒加载 4.group_ ...

  8. SQLAlchemy(四):SQLAlchemy查询高级

    目录 SQLAlchemy04 /SQLAlchemy查询高级 1.排序 2.limit.offset和切片操作 3.懒加载 4.group_by 5.having 6.join 7.subquery ...

  9. Python实战 :2017国考职业表excel转数据库,再查询生成excel

    最近看2017年国考的职业表,多而杂,不好过滤我想要的信息,特此把它转成Sqlite3数据库,再从数据库里把查询结果导出成excel,方便找职业. (后附上整套代码) 环境:python2.7   x ...

随机推荐

  1. dokuwiki安装问题

    工作了几年,虽然在程序员这个道路上才算开始,希望以后能够有所成长,为了把平时遇到的技术问题,记录下来,第一个想到的就是写wiki,博客虽然创建了许久,但是没有坚持写下去,在网上找了许多的wiki程序, ...

  2. 05-nginx定时任务完成日志切割

    目标:每天晚上凌晨一点钟左右把昨天的任务给它切掉,把昨天的日志给它改个名存起来,根据昨天的时间给它改个名存起来,所以要根据日期生成文件名. 也许你不会写bash脚本,但是老师带着你一步一步地来. sh ...

  3. libevent源码分析

    这两天没事,看了一下Memcached和libevent的源码,做个小总结. 1.入门 1.1.概述Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络 ...

  4. 编程中&&和||的妙用

    &&符号在编程中表示“和”,也就是数学中的“且”! if(A && B){ } 上面的代表表示A==true并且B==true的情况下就执行花括号里面的代码. 值得注意 ...

  5. Hadoop完全分布式环境搭建(三)——基于Ubuntu16.04安装和配置Java环境

    [系统环境] 1.宿主机OS:Win10 64位 2.虚拟机软件:VMware WorkStation 12 3.虚拟机OS:Ubuntu16.04 4.三台虚拟机 5.JDK文件:jdk-8u201 ...

  6. weblogic参数说明

    公司有个项目,部署在weblogic8.1上之后,发现比在tomcat下慢很多,经过分析排查,原因是web应用的WEB-INF下的weblogic.xml里的参数设置不合理(使用默认值有时并非最佳值) ...

  7. 使用pycharm运行调试scrapy

    摘要 Scrapy是爬虫抓取框架,Pycharm是强大的python的IDE,为了方便使用需要在PyCharm对scrapy程序进行调试 python PyCharm Scrapy scrapy指令其 ...

  8. dev初识 拖动分组

    1.前台代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm ...

  9. 【转】.net 在线播放各类视频

    原文地址:http://blog.csdn.net/hefeng_aspnet/article/details/9704857 一.后台拼字符串动态加载写法 前台调用代码 <!DOCTYPE h ...

  10. c# 对象反射赋值未知属性需类型转换

    反射某个类时,对于类的属性,字段.已知有已知的方法,未知有未知的写法. 而SetValues赋值则需要类型转换 情况1,该属性类型是已知类型,例如:int int value=500; propert ...