一、数据准备:配置数据库、创建数据库引擎、创建基类、创建session

from sqlalchemy import create_engine, Column, Integer, ForeignKey, String, TEXT, Boolean, DATE, DECIMAL
from sqlalchemy.ext.declarative import declarative_base
from datetime import date
from sqlalchemy.orm import sessionmaker,relationship,backref#配置数据库
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'test'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)#创建数据库引擎
engine=create_engine(DB_URI)#创建基类,所有的模型类继承基类
Base=declarative_base(engine)#创建session
session=sessionmaker(engine)()

二、创建模型类(部门表和员工表)

#创建模型类
class Dept(Base):__tablename__='t_dept2'dept_no=Column(name='dept_no',type_=Integer,primary_key=True,autoincrement=True)dept_name=Column(name='dept_name',type_=String(20))city=Column(name='city',type_=String(20))#代表当前部门下的所有员工列表,这种写法不是最好的,最优的写法只要在一个对象中关联就可以了#emp=relationship('Emp') #参数必须是另一个关联模型类的类名def __str__(self):return f'部门编号:{self.dept_no}部门:{self.dept_name}城市:{self.city}'class Emp(Base):__tablename__='t_emp2'emp_no=Column(name='emp_no',type_=Integer,primary_key=True,autoincrement=True)emp_name=Column(name='emp_name',type_=String(20))hire_date=Column(name='hire_date',type_=DATE)sal=Column(name='sal',type_=DECIMAL(10,2))#todo 设置外键关联,在从表中增加一个字段,指定这个字段外键的是哪个表的哪个字段就可以了。从表中外键的字段,必须和主表的主键字段类型保持一致。dept_no=Column(ForeignKey('t_dept2.dept_no',ondelete='CASCADE'),name='dept_no',type_=Integer)#代表员工所属的部门信息,backref:反向关联的属性名,lazy='dynamic:懒加载dept=relationship('Dept',backref=backref('emps',lazy='dynamic'))        #参数必须是另一个关联模型类的类名def __str__(self):return f'员工编号:{self.emp_no}员工姓名:{self.emp_name}员工入职时间:{self.hire_date}员工薪资:{self.sal}'#根据模型类建表
#Base.metadata.create_all()
#Base.metadata.drop_all()

group_by
根据某个字段进行分组
having
having是对分组查找结果作进一步过滤

案例

def test_group():# 统计每个工资级别下有多少员工result=session.query(Emp.sal,func.count(Emp.emp_no)).group_by(Emp.sal).all()print(result)#统计每个部门下有多少员工result1=session.query(Emp.dept_no,func.count(Emp.emp_no)).group_by(Emp.dept_no).all()print(result1)# 统计每个工资级别下有多少员工,只统计7000以上的result2 = session.query(Emp.sal, func.count(Emp.emp_no)).group_by(Emp.sal).having(Emp.sal>7000).all()print(result2)

执行结果:

[(Decimal('8888.88'), 1), (Decimal('5555.88'), 1), (Decimal('6000.00'), 1), (Decimal('10000.00'), 2), (Decimal('7777.77'), 1), (Decimal('8000.00'), 1)]
[(1, 5), (2, 2)]
[(Decimal('8888.88'), 1), (Decimal('10000.00'), 2), (Decimal('7777.77'), 1), (Decimal('8000.00'), 1)]

子查询
子查询即select语句中还有select。
那么在sqlalchemy中,要实现一个子查询,需以下几个步骤:

1. 将子查询按照传统的方式写好查询代码,然后在query对象后面执行subquery方法,将这个查询变成一个子查询。

2. 在子查询中,将以后需要用到的字段通过label方法,取个别名。

3. 在父查询中,如果想要使用子查询的字段,那么可以通过子查询的返回值上的c属性拿到(c=Column)。

案例

def test_subquery():#查询和django这个员工,入职时间、工资都相同的其他员工#第一步:写子查询result3=session.query(Emp.hire_date.label('h_d'),Emp.sal.label('sal')).filter(Emp.emp_name=='django').subquery()print(result3)#第二步:写父查询result4=session.query(Emp).filter(Emp.hire_date==result3.c.h_d,Emp.sal==result3.c.sal).all()print(result4)          #查看sql语句for i in result4:print(i)
SELECT t_emp2.hire_date AS h_d, t_emp2.sal AS sal
FROM t_emp2
WHERE t_emp2.emp_name = %(emp_name_1)s[<__main__.Emp object at 0x000001BDEDEEBAF0>, <__main__.Emp object at 0x000001BDEDEEBB50>]员工编号:6员工姓名:django员工入职时间:2021-12-12员工薪资:10000.00
员工编号:13员工姓名:mysql员工入职时间:2021-12-12员工薪资:10000.00

【Flask】ORM高级操作之分组、过滤和子查询相关推荐

  1. mongodb java 多条件查询_MongoDB查询之高级操作详解(多条件查询、正则匹配查询等)...

    MongoDB查询之高级操作 语法介绍 MongoDB查询文档使用find()方法,同时find()方法以非结构化的方式来显示所有查询到的文档. -- 1.基本语法 db.collection.fin ...

  2. mysql 子查询分组_mysql之子查询与分组查询

    有时候需要对查询结果进行分组,以便于我们对分组后的数据进行计算,可以使用数据分组操作 数据分组查询 group by 需要注意的是group by只是创建分组.并不能保证分组里面的数据排序.如果需要排 ...

  3. mysql修改的值子查询语句_MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)

    子查询的限制 ● 通常,不能在子查询中修改表并从同一表中进行选择.例如,此限制适用于以下形式的语法: 1. DELETE FROM t WHERE ... (SELECT ... FROM t ... ...

  4. 【Flask】ORM高级操作之排序和分页操作

    一.数据准备 from sqlalchemy import create_engine, Column, Integer, ForeignKey, String, TEXT, Boolean, DAT ...

  5. Oracle笔记(六) 多表查询、统计函数及分组查询、子查询

    本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查询一起完成各个复杂查询的操作: 一 ...

  6. Flask ORM SQLAlchemy数据操作完整案例

    ORM ORM 全拼Object-Relation Mapping. 中文意为 对象-关系映射. 主要实现模型对象到关系数据库数据的映射. 比如:把数据库表中每条记录映射为一个模型对象 优点 只需要面 ...

  7. 批量模糊查询_Django之ORM表高级操作、增删改查、F/Q查询等

    目录 一.如何开启自己的测试脚本? 二.对表数据的添加.更新.删除1.create()变态操作之批量插入数据2.update()3.delete()4.如何查看QuerySet对象执行的sql语句?5 ...

  8. Beego脱坑(十四)ORM高级查询

    title: Beego脱坑(十四)ORM高级查询 tags: go,beego,orm author : Clown95 本文将讲述beego ORM的一些高级查询,这也是ORM最核心的部分,本文所 ...

  9. Day 41 Mysql高级操作

    Mysql高级操作 一.视图 视图(view)是一种虚拟存在的表,是一个逻辑表,本身不包含数据.本质是一个保存的子查询语句,通过视图,可以展现基表的部分数据 基表:用来创建视图的表叫做基表 base ...

最新文章

  1. 思科防火墙PIX ASA精华配置总结
  2. 【白话科普】网站图片不显示,背后的原因你都清楚吗
  3. Create new Fiori catalog group via personalization
  4. 使用Redis Stream来做消息队列和在Asp.Net Core中的实现
  5. boost::scoped_ptr与std::unique_ptr
  6. 【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢
  7. centos 安装oracle java,CentOS 4.4下安装Oracle 10
  8. 链路层 - SLIP,PPP,
  9. 网卡多队列:RPS、RFS、RSS、Flow Director(DPDK支持)
  10. 浅谈!important对CSS的重要性
  11. web元件库/常用web组件/常用表单/导航栏/边框/图标/日期时间选择器/评分组件/穿梭框/输入框/步骤条/计数器/输入框/Axure原型/axure元件库/rp原型/交互控件/五星评分器/导航框架
  12. 聊聊Spring Data Auditable接口的变化
  13. SAP FICO财务模块FI财务CO成本视频教学教程(基础+进阶+高级篇)
  14. linux daemontools 安装
  15. Java实现国密电子签章(itext+bouncycastle +sm3withsm2)
  16. 基于Python实现的基金交易系统
  17. 伯克利摘得最佳论文 | ACL2022奖项公布
  18. 网站提示HTTP503Service Unavailable的处理办法
  19. c语言—冒泡排序(详解)
  20. The error may involve XXX(包)-Inline The error occurred while setting parameters

热门文章

  1. python elseif用法_python学习笔记(一)
  2. 解读全球海缆地图,带你看懂隐藏的秘密
  3. 通信基站电源维护培训PPT课件
  4. 9300万美元投资涌入 新加坡成亚太最大数据中心
  5. CV之face_recognition:Py之face_recognition库安装、介绍、使用方法详细攻略
  6. Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现
  7. 成功解决sys.argv[1] IndexError: list index out of range错误
  8. linux下的/dev/shm/ 以及与swap目录的区别【转】
  9. http协议、cookie及session
  10. BrowserLog——使用Chrome控制台作为Log查看器