首页 > 数据库 >sqlalchemy高级查询操作

sqlalchemy高级查询操作

时间:2024-03-11 15:26:17浏览次数:15  
标签:sqlalchemy Users 高级 ret 查询 session query id name

连接数据库准备

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
from models import Users,Person,Hobby,Boy,Girl
from sqlalchemy.sql import text

engine = create_engine("mysql+pymysql://root:[email protected]:3306/sqlalchemy01", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = scoped_session(Session)

1 filter_by(写条件)

ret = session.query(Users).filter_by(name='xxx').all()
print(ret)

2 and条件连接

ret = session.query(Users).filter(Users.id > 1, Users.name == 'xxx').all()
print(ret)

3 between条件连接

# SQL语句
# select * from users where user.id between 4 and 10 and name=xxx;

ret = session.query(Users).filter(Users.id.between(4, 10), Users.name == 'xxx')
print(ret)

4 in 条件

ret = session.query(Users).filter(Users.id.in_([1,4,5])).all()
print(ret)

5 ~ (非,除...外)

ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
print(ret)

6 二次筛选

# SQL语句
# select * from users where id in (select id from users where name = xxx);

ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='xxx'))).all()
print(ret)

7 and 和 or 条件

# 导入模块
from sqlalchemy import and_, or_
# or_包裹的都是or条件,and_包裹的都是and条件
ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'xxx')).all()

ret = session.query(Users).filter(Users.id > 3, Users.name == 'xxx').all() # 根上面一样

# SQL语句
# select * from users where id<=2 or name =xxx;

ret = session.query(Users).filter(or_(Users.id <= 2, Users.name == 'xxx')).all()

# SQL语句
# select * from users where id <2 or (name=xxx and id>3) or extra !='';

ret = session.query(Users).filter(
    or_(
        Users.id < 2,
        and_(Users.name == 'xxx', Users.id > 3),
        Users.extra != ""
    ))

8 like 查询

# SQL语句
# select * from users where name like l%;

ret = session.query(Users).filter(Users.name.like('l%')).all()
# 不以'l'开头
ret = session.query(Users).filter(~Users.name.like('l%')).all()

9 限制,用于分页,区间

ret = session.query(Users)[1:2]  # 去第一条到第二条  其实就是只取 第二条,从0开始

10 排序,根据name降序排列(从大到小)

ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.asc())
ret = session.query(Users).order_by(Users.name).all()

# 第一个条件重复后,再按第二个条件升序排
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()

11 分组

# 导入模块
from sqlalchemy.sql import func

# select name from users group by name;  一旦分组,只能查询 分组字段和 聚合函数的字段
# 以用户名字分组(有重复名)
ret = session.query(Users.name).group_by(Users.name).all()

# 分组之后取最大id,id之和,最小id 和名字
ret = session.query(
    func.max(Users.id),
    func.sum(Users.id),
    func.min(Users.id),
    func.count(Users.id),
    Users.name
    ).group_by(Users.name).all()

# haviing筛选
# SQL语句
# select max(id),sum(id),min(id),count(id),name from users group by name where id >2 having min(id)>2;

ret = session.query(
    func.max(Users.id),
    func.sum(Users.id),    
    func.min(Users.id),
    func.count(Users.id),
    Users.name
    ).filter(Users.id>2).group_by(Users.name).having(func.min(Users.id) >2)

12 连表(默认用forinkey关联)

# SQL语句
# select * from person,hobby where user.hobby_id=hobby.id;

ret = session.query(Person, Hobby).filter(Person.hobby_id == Hobby.id).all()

# join表,默认是inner join
# SQL语句
# select * from person inner join hobby on person.hobby_id=hobby.id;

ret = session.query(Person).join(Hobby).all()

# isouter=True 外连,表示Person left join Hobby,没有右连接,反过来即可
# SQL语句
# select * from person left join hobby on person.hobby_id=hobby.id;

ret = session.query(Person).join(Hobby, isouter=True).all()
ret = session.query(Hobby).join(Person, isouter=True).all()  # 右连接

# 没有指定链表条件,默认以外键关联
# 自己指定on条件(连表条件),第二个参数,支持on多个条件,用and_,同上
# SQL语句
# select * from Person left join hobby on person.id=hobby.id;  # sql 没有意义,只是书写案例
ret = session.query(Person).join(Hobby,Person.id==Hobby.id, isouter=True)

13 union和union all

# 组合(了解)UNION 操作符用于合并两个或多个 SELECT 语句的结果集
# union和union all的区别? union会去除重复的行,还会对结果集进行排序
q1 = session.query(Boy.id,Boy.name).filter(Boy.id > 1)
q2 = session.query(Girl.id,Girl.name).filter(Girl.id < 10)
ret = q1.union(q2).all()

q1 = session.query(Boy.name).filter(Boy.id > 1)
q2 = session.query(Girl.name).filter(Girl.id < 10)
ret = q1.union_all(q2).all()
print(ret)

# 提交事务
session.commit()
# 关闭session
session.close()

标签:sqlalchemy,Users,高级,ret,查询,session,query,id,name
From: https://www.cnblogs.com/wellplayed/p/18066132

相关文章

  • 一次解决Docker内java变量原因导致执行Kafka查询消费报错经历
    引言企业内对某设备小集群进行状态巡检(包括内存、磁盘、CPU、集群状态、集群Docker内接口状态、服务状态、Kafka消费情况监控)。由于需要将状态的结果通过命令展示在命令行中,且查询命令较多,于是打算脚本解决。在写脚本时,查询内容包括了宿主机和docker内的服务都需......
  • django 动态查询实现过程
    django动态查询实现过程一、背景描述在前端页面上有查询功能,要查询的输入选择有username,address,mobile等,可以通过任意一个查询,或者任意组合进行查询。后端,获取传入的数值。判断哪个有输入,再在数据库中进行查询二、解决方案根据条件,动态实现查询过程condition={}ifusern......
  • Mysql和Clickhouse数据查询-按照时间分组统计并且对无无数据的日期补0
      最近在做数据查询需求的时候,遇到按照时间分组查询统计指标的需求,比如说查询模块的最近15天访问数据量,没有数据的日期补0,以前对于这种类似的需求都是通过代码来补数据,想试试sql实现这种查询,因此查询了不少文章,对于类似实现方法的文章网上也有很多,差异也很多,因此这篇文章只......
  • Dynamics CRM 2013 常用SQL查询基础数据
    获取实体SELECT*FROMEntityWHERELogicalName='EntityName'获取字段名称SELECTdistinctA.nameAS字段名,L.labelAS显示名,AT.descriptionAS类型,L.ObjectColumnNameAS形式,A.IsNullableAScodefromattributeAINNERJOINlocalizedlabelLONA.Attributei......
  • [转][SQL Server]分页查询
    方式一:使用OFFSET/FETCH子句(SQLServer2012及以上版本支持)--假设PageSize表示每页的记录数,pageNumber表示当前页码(从1开始)DECLARE@PageSizeINT=10;DECLARE@pageNumberINT=3;SELECT*FROMtable1ORDERBYId--或者按其他字段排序OFFSET(@pageNumber-......
  • MySQL 8.0.26版本升级32版本查询数据为空的跟踪
    某业务系统将MySQL8.0.26升级为GreatSQL8.0.32-24后,某些特定的SQL语句不能查询到数据。经测试MySQL8.0.32也存在相同的问题此BUG已在GreatSQL8.0.32-25版本中解决MySQL8.0.26版本升级32版本查询数据为空的跟踪接到客户反馈的问题后,对问题进行了复现和分析。版本信......
  • MYSQL学习笔记23: 多表查询(自连接内连接+左右外连接)
    多表查询(自连接)自连接查询,可以是内连接查询,也可以是外连接查询select字段列表from表A别名Ajoin表A别名Bon条件...;自连接内连接查询员工以及所属领导的名字#可以这样写selecte1.name'员工',e2.name'上司'fromempe1joinempe2one1.man......
  • MYSQL学习笔记24: 多表查询(联合查询,Union, Union All)
    多表查询(联合查询,union,unionall)union查询需要多张表的列数一致,字段类型也保持一致对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集select字段列表from表A...union[all]select字段列表from表B...;查询出薪资低于10000,或年龄......
  • MYSQL学习笔记25: 多表查询(子查询)[标量子查询,列子查询]
    多表查询(子查询)子查询,也称嵌套查询子查询的语句可以是insert/update/delete/select中的任何一个根据子查询的结果不同,可以分为:标量子查询(结果为单个值)列子查询(结果为一列)行子查询(子查询结果为一行)表子查询(子查询结果为多行多列)select*fromt1wh......
  • sqlalchemy关系操作
    一对多关系models表创建importdatetimefromsqlalchemyimportcreate_enginefromsqlalchemy.ormimportdeclarative_base,relationshipfromsqlalchemyimportColumn,Integer,String,Text,ForeignKey,DateTime,UniqueConstraint,IndexBase=declarative_base......