SQLAlchemy查询

结果查询

上节课使用query从数据库中查询到了结果,但是query返回的对象是直接可用的吗?

首先导入模块

from connect import session
from user_modules import User

query返回对象

rs = session.query(User)
print(rs)
for i in rs:
     print(i)
#----------------------------------

#根据返回结果来看, rs  是一个 Query 对象,打印出来可以看到转化的 SQL
rs = session.query(User).filter(User.username=='塔卡')

#all 是返回所有符合条件的数据 rs = session.query(User).all() #查询所有数据,返回一个列表 print(rs) print(rs[0].username) #属性访问
#first 是返回所有符合条件数据的第一条数据 rs = session.query(User).first() #查询第一条数据
#[0] 和 first 类似,但是如果没有符合条件的数据则会报错 session.query(User).filter(User.username=='budong')[0]
#这里,在 query 中查询对象的某个属性值 ( 对应为查询表中某个字段的值 ),返回的结果不再是一个 Query 对象,而是一个列表 rs = session.query(User.username).filter(User.username == '塔卡').all()
#同理,但是 first 返回结果是一个元组 rs = session.query(User.username).filter(User.username == '塔卡').first()
#[0] 和 first 类似,但是如果没有符合条件的数据则会报错 session.query(User.username).filter(User.username=='budong')[0] #getattr(rs[0], 'username'), rs[0].username这两种方式可以取到具体的数据值 rs = session.query(User).filter(User.username=='budong').all() print(hasattr(rs,'username')) print(getattr(rs,'username','litao')) rs = session.query(User)[0:2] #索引取值 print(rs) # rs2 = session.query(User).filter(User.username=='塔卡').all() # print(rs,type(rs))

条件查询一

过滤函数

filter 是一个过滤函数,过滤条件都可以书写在此函数中,不同的条件之间用 逗号 分隔

filter_by 也是一个过滤函数,但是功能要弱一些

filter 和 filter_by 的区别

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

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

2. filter_by 中只能添加等于的条件,不能添加 不等于、大于小于等条件,filter没有这个限制

rs = session.query(User.username).filter(User.username == '塔卡')
rs2 = session.query(User.username).filter_by(username = '塔卡')
print(rs)

like 和 notlike

like 是模糊查询,和数据库中的 like 用法一样

notlike 和 like 作用相反

rs = session.query(User).filter(User.username.like('%塔%')).all()
rs = session.query(User).filter(User.username.notlike('%塔%')).all()

in_  和 notin

in_ 和 notin_ 是范围查找

rs = session.query(User.username).filter(User.username.in_(['塔卡','小泼'])).all()
rs = session.query(User.username).filter(User.username.notin_(['塔卡','小泼'])).all()

is_ 和 isnot

is_  和 isnot  精确查找

rs = session.query(User).filter(User.username.is_(None)).all()
rs = session.query(User).filter(User.username.isnot(None)).all()
#判断为空还可以使用:
session.query(User.id).filter(User.username==None).all()

查询结果数:限制查询

all、limit、offset、slice、one

rs  =session.query(User.username).all()
print(rs)
rs  =session.query(User.username).limit(2).all()  #限制数量查询
rs  =session.query(User.username).offset(2).all()  #偏移量
rs  =session.query(User.username).slice(1,4).all()  #切片

#不管怎样写one只能查一条数据,如果有多条重复数据,会报错
#sqlalchemy.orm.exc.MultipleResultsFound: Multiple rows were found for one()
rs = session.query(User.username).filter(User.username == '李涛').one()
print(rs)

排序:倒叙先进行导入desc

from sqlalchemy import desc
rs = session.query(User.username,User.id).order_by(User.id).all() #升序排列
rs = session.query(User.username,User.id).order_by(desc(User.id)).all()

#综合使用
rs = session.query(User.username,User.id).order_by(desc(User.id)).filter(User.username == '李涛').all()
print(rs)

聚合函数

func.count

使用函数时,需要导入 func, group_by 和 order_by 一样,是可以直接使用的,不需要导入

having 也可以直接使用,使用方法也和 SQL 中使用类似

func.sum、func.max、func.min

extract

extract 提取对象中的数据,这里提取分钟,并把提取出来的结果用 label 命名别名,之后就可以使用 group_by 来分组

count 里面同样可以使用 *

or_

or_ 是或者的意思,和数据库中的 or 一样

# 分组查询与聚合函数一起使用
from sqlalchemy import func,extract,or_
# rs = session.query(User.password,func.count(User.id)).group_by(User.password).all()
# rs = session.query(User.password,func.count(User.id)).group_by(User.password).having(func.count(User.id) >1).all()
# print(rs)

# rs = session.query(User.password,func.sum(User.id)).group_by(User.password).all()
# rs = session.query(User.password,func.max(User.id)).group_by(User.password).all()
# rs = session.query(User.password,func.min(User.id)).group_by(User.password).all()
# print(rs)

#extract
# rs = session.query(extract('minute',User.create_time).label('minute'),func.count(User.id)).group_by('minute').all()


#or
rs = session.query(User.username).filter(or_(User.username.isnot(None),User.password == '1234')).all()
print(rs)

猜你喜欢

转载自www.cnblogs.com/taoge188/p/10646386.html