SQLAlchemy数据库查询

SQLAlchemy数据库查询@TOC

SQLAlchemy数据库查询

限制查询返回结果

print( session.query(User).filter(User.username!=‘jingqi’).limit(2).all())
print( session.query(User).filter(User.username!=‘jingqi’).offset(2).all())
print( session.query(User).filter(User.username!=‘jingqi’).slice(2,3).all())
第一个是限制返回条数,从第一条开始;第二个是从第三条开始返回查询结果;第三个是切片返回记录。

排序之后再进行限制

from sqlalchemy import desc print(
session.query(User).filter(User.username!=‘budong’).order_by(User.username).all()) print(session.query(User).filter(User.username!=
‘budong’).order_by(desc(User.username)).slice(1,3).all())

不等于

print( session.query(User).filter(User.username!=‘jingqi’).all() )

模糊匹配 like

print( session.query(User).filter(User.username.like(‘jingqi’)).all() )
print( session.query(User).filter(User.username.notlike(‘jingqi’)).all())

成员属于 in_

print( session.query(User).filter(User.username.in_([‘jingqi’,‘jingqi1’])).all() )

成员不属于 notin_

print( session.query(User).filter(User.username.notin_([‘jingqi’,‘jingqi2’])).all() )

空判断

print( session.query(User).filter(User.username==None).all() )
print( session.query(User).filter(User.username.is_(None)).all() )
print( session.query(User).filter(User.username.isnot(None)).all() )

多条件

print( session.query(User).filter(User.username.isnot(None),
User.password==‘qwe123’).all() )

选择条件

from sqlalchemy import or_,and_,all_,any_
print( session.query(User).filter(or_
(User.username==‘jingqi’,User.password==‘qwe123’)).all() )
print( session.query(User).filter(and_
(User.username==‘jingqi2’,User.password==‘111’)).all() )
Any:>Any 表示至少大于一个值,即大于最小值。
All: >All 表示大于每一个值。换句话说,它表示大于最大值

查询名字结尾字符为g的所有数据

endwithg = User.query.filter(User.name.endswith(“g”)).all()
print(endwithg)

查询名字开头字符为g的所有数据

startwithg = User.query.filter(User.name.startswith(“z”)).all()

每页3个,查询第2页的数据

ret = paginate(页码,每一页的数据量)
ret = User.query.paginate(2,3)
print(ret.page)
print(ret.items)

聚合函数

from sqlalchemy import func,extract
print( session.query(User.password,func.count(User.id)).group_by
(User.password).all() )
print( session.query(User.password,func.count(User.id)).group_by
(User.password).having(func.count(User.id)>1).all() )
print( session.query(User.password,func.sum(User.id)).group_by
(User.password).all() )
print( session.query(User.password,func.max(User.id)).group_by
(User.password).all() )
print( session.query(User.password,func.min(User.id)).group_by
(User.password).all() )

使用extract提取时间中的分钟或者天来分组

print( session.query(extract(‘minute’, User.creatime).label
(‘minute’),func.count(’’).label(‘count’)).group_by(‘minute’).all() )
print( session.query(extract(‘day’, User.creatime).label
(‘day’),func.count(’
’).label(‘count’)).group_by(‘day’).all() )

多表查询

内连接,也被称为自然连接,只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中所有相匹配的数据,舍弃了不匹配的数据

内连接

for u, a in session.query(User, Address).filter(User.id== Address.user_id).
filter(Address.email_address==‘jack@google.com’).all():
print(u)
print(a)
print( session.query(User.username,UserDetails.lost_login).join
(UserDetails,UserDetails.id == User.id).all() ) #这个是inner join
print( session.query(UserDetails,User).all() ) #这个是 cross join(交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积)
print( session.query(UserDetails,User).filter(User.id==UserDetails.id).all() ) #这是也是cross join 但是加上了where条件

左连接

print( session.query(User.username,UserDetails.lost_login).outerjoin
(UserDetails,UserDetails.id==User.id).all() ) #这个才是左连接,sqlalchemy没有右连接
q1 = session.query(User.id)
q2 = session.query(UserDetails.id)
print(q1.union(q2).all()) #这个是union关联

子查询

from sqlalchemy import all_,any_
sql_0 = session.query(UserDetails.lost_login).subquery() #这是声明一个子表
print( session.query(User).filter((User.creatime > all_(sql_0)) ).all() )
print( session.query(User).filter((User.creatime > any_(sql_0)) ).all() )
注意any_all_的区别,all_要求的是所有都满足,any_只需要有满足的
就行。
from sqlalchemy.sql import func
stmt = session.query(Address.user_id, func.count(’*’).label(‘address_count’)). group_by(Address.user_id).subquery()
for u, count in session.query(User, stmt.c.address_count).outerjoin(stmt, User.id==stmt.c.user_id).order_by(User.id):
print(u, count)

原生SQL的查询以及其他使用

#第一步写好原生的sql,如果需要传递参数,可以使用字符串拼接的方式
sql_1 = “”"
select * from user
“”"
#第二步执行,得到返回的结果
row = session.execute(sql_1)
print(row,dir(row))
#第三步,自己控制得到数据的方式
print( row.fetchone() )
print( row.fetchmany() )
print( row.fetchall() )
#也可以循环获得
for i in row:
print(’===’,i)

PostgreSQL json 索引实践 - 检索(存在、包含、等值、范围等)

链接: https://developer.aliyun.com/article/647475

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值