SQLAlchemy教程-第四章-SQL常用查询的ORM写法进阶2-待完善

内容预告

  • 别名的用法
  • 函数的用法
  • 分组的写法.
  • case when的用法.
  • exists的用法

为啥要用别名?

  • 如果两个表的两列名字相同, 那么为了区分这两列, 必须使用别名.
  • 如果有一列是通过运算出来的, 那么一定要给这列起个名字, 否则无法在查询结果中引用.

    看别名的写法.

先把代码贴上来, 然后注释我都在代码里写了, 请大家自行阅读~ (#^.^#)

from models import *

# 别名
def query_with_column_alias():
    emps = sess.query(Emp.ename.label(‘name‘)).all()
    for item in emps:
        print(item)
    ‘‘‘
    output:

    (‘SMITH‘,)
    (‘ALLEN‘,)
    (‘WARD‘,)
    (‘JONES‘,)
    (‘MARTIN‘,)
    (‘BLAKE‘,)
    (‘CLARK‘,)
    (‘SCOTT‘,)
    (‘KING‘,)
    (‘TURNER‘,)
    (‘ADAMS‘,)
    (‘JAMES‘,)
    (‘FORD‘,)
    (‘MILLER‘,)
    (‘KATE‘,)

    note:

    输出的结果是元祖. 请注意写法, 括号里面带一个逗号, 表明是元祖tuple, 如果没有这个逗号, 讲不被python认为是tuple.
    例如:

    In [1]: a = (1)

    In [2]: type(a)
    Out[2]: int

    In [3]: b = (1,)

    In [4]: type(b)
    Out[4]: tuple

    ‘‘‘

# 别名查询, 并且在查询结果中引用.
def query_with_column_alias_and_call_it():
    emps = sess.query(Emp.ename.label(‘name‘)).limit(3).all()  # 请注意, limit(3)意思是查三条. 这是mysql的特殊用法.
    emp1 = emps[0]
    print(type(emp1))  # 我们查看一下 emp1是什么类型的.
    # 如何引用name属性呢?
    name1 = emp1.name  # 用属性的方式引用
    print(‘name1‘, name1)
    name2 = emp1[0]  # 用数组的方式引用.
    print(‘name2‘, name2)
    ‘‘‘
    output:

    <class ‘sqlalchemy.util._collections.result‘>
    name1 SMITH
    name2 SMITH

    note:

    查询结果单个对象是一个实现了 tuple 的类, 既可以当数组用, 又可以当对象用.
    但是这是一个冻结的数组和对象. 不可以修改. 也就是不能当普通的数组和对象用.不能添加属性和元素.

    ‘‘‘

# 函数的用法
def query_with_function():
    from sqlalchemy import func
    from sqlalchemy.sql import label
    # 这次, 我想查员工的工资. 但是不显示十位和各位. 比如 9124, 我只显示为9100. 怎么做呢? 使用python的方法吗. 太笨了. 我们直接调用mysql的内置方法.
    comms = sess.query(Emp.ename, Emp.comm, label(‘comm_trunc‘, func.truncate(Emp.comm, -2))).limit(3).all()
    for item in comms:
        print(item.ename, item.comm, item.comm_trunc)

    ‘‘‘
    output:

    SMITH 1999.00 1900
    ALLEN 300.00 300
    WARD 500.00 500

    note:

    这里的label用法的另一种写法.
    之前我们直接使用 Emp.ename.label(‘name‘)
    这里我们使用 label(‘comm_trunc‘, func.truncate(Emp.comm, -2)), 这是对函数的其中一种写法.

    func.XXX 可以使用原生的数据库里的所有方法, 只需要加个前缀func. 既可.
    喜欢原生数据方法的请大胆使用.

    关于truncate方法, 请参考 https://www.w3schools.com/sql/func_mysql_truncate.asp

    ‘‘‘

# 分组的用法
def query_and_group():
    # 本次, 我们要统计每个职业有多少员工.
    from sqlalchemy import func
    results = sess.query(Emp.job, func.count(Emp.empno).label(‘job_count‘)).group_by(Emp.job).all()
    for item in results:
        print(item.job, item.job_count)

    ‘‘‘
    output: 

    ANALYST 2
    CLERK 4
    MANAGER 4
    PRESIDENT 1
    SALESMAN 4

    note:

    group_by的用法:
    通过查看终端的打印的语句,我们看到sql是这样的
    SELECT emp.job AS emp_job, count(emp.job) AS job_count
        FROM emp GROUP BY emp.job

    我们这样理解:
        先根据job分组, 然后查看每组有多少人.
    select 子查询里面, 单独查询的列, 比如select emp.job, 这个job一定是分组依据. 否则出现在select语句里面.
           子查询里面的聚合函数列, 则没有限制, 可以随意使用聚合函数对任意列进行数据处理.
    为什么我们本次要使用count呢?
    回到我们的目的, 我们要查询每组有多少人.

    label的第三种写法:
    在函数后面直接使用.label这种链式写法. 我之前没想过还可以这么写, 这样写完全是我尝试出来的.
    原因是, 英语文档没有细读, 不知道这么用. 其次, 英语文档读的太慢了, 英语水平有限, 无法深入挖掘sqlalchemy的用法  ̄□ ̄||.
    ‘‘‘

# 分组的用法
def query_and_group_plus():
    # 本次, 我们要统计每个职业有多少员工. 而且我们要增加额外的分组依据, 员工所在的位置(部门表里的loc字段), 所以我们要进行联合查询
    from sqlalchemy import func
    results = sess.query(Dept.loc, Emp.job, func.count(Emp.empno).label(‘job_count‘))         .join(Emp, Emp.deptno == Dept.deptno)         .group_by(Dept.loc, Emp.job).all()
    for item in results:
        print(item.loc, item.job, item.job_count)

    ‘‘‘
    output:

    CHICAGO CLERK 1
    CHICAGO MANAGER 1
    CHICAGO SALESMAN 4
    DALLAS ANALYST 2
    DALLAS CLERK 2
    DALLAS MANAGER 1
    NEW YORK CLERK 1
    NEW YORK MANAGER 1
    NEW YORK PRESIDENT 1

    note:

    通过本次的查询, 大家应该可以清楚的看到各个地区各个职位的分布了. 也能从查询结果中挖掘到一些信息. 这就是统计的作用.
    这次, 也告诉大家, 我们可以使用 多列进行分组统计.

    ‘‘‘

if __name__ == ‘__main__‘:
    query_and_group_plus()

case_when和exists的语法下午补上.



SQLAlchemy官方网站

http://docs.sqlalchemy.org/en/latest/contents.html

教程全部代码github地址

https://github.com/notfresh/sqlalchemy_demo

原文地址:https://www.cnblogs.com/notfresh/p/9282030.html

时间: 2024-11-05 20:47:00

SQLAlchemy教程-第四章-SQL常用查询的ORM写法进阶2-待完善的相关文章

SQLAlchemy教程-第二章-SQL常用查询的ORM写法

今天是2018-07-02. 今天来写一些常用的SQL查询的ORM写法. 先把Emp, 也就是员工表的模型补上. class Emp(Base): __tablename__ = 'emp' empno = Column(Integer, primary_key=True) ename = Column(String(10)) job = Column(String(9)) mgr = Column(Integer) hiredate = Column(Date) comm = Column(D

MySQL教程(四) SQL连接查询

更多情况下,我们查询的数据来源于多张表,所有有必要了解一下MySQL中的连接查询. SQL中将连接查询分成四类:交叉连接,内连接,外连接和自然连接. 数据准备 student表 -- ---------------------------- -- Table structure for `student` -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` in

数据库-第四章 SQL语句查询

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SQL查询的基本结构 集合运算   空值   聚集函数   嵌套子查询   数据库的修改 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SQL查询的基本机

(转)JAVA AJAX教程第四章—AJAX和MVC的简单结合

这里我们再理解了AJAX后,开始来用实例感受AJAX的力量. 今天我最后要实现的效果,当鼠标放到图片上时会根据,会把数据库库里的数据读出,通过显示框显示出来.这个在很多网上商店都有用到这里效果,我们这里用AJAX来实现这个效果.这个实例里结合了MySql.Servlet还有Js,理论性很少,但通过实践来感受理论知识. 一个页面中应用了 AJAX,同时他也能实现MVC框架,可以吗?当然可以的.通过页面调用AJAX,这个页面就是MVC中的V,他用来前台显示与用户交互的内容.用 JavaBean作为M

[Learn Android Studio 汉化教程]第四章 : Refactoring Code

[Learn Android Studio 汉化教程]第四章 : Refactoring Code 第四章 Refactoring Code    重构代码 在Android Studio中开发,解决方案不会总是一蹴而成的.作为一个有效率的编程者,在你的开发,调试和测试中需要一些弹性以及代码重构.随着在这章中的行进,你将明白Android Studio如何产生代码:在这章里你将看到Android Studio如何重构你的代码.重构代码最大的风险是可能引入不期望的错误.通过分析某些风险重构操作的结

第四章 MySQL高级查询(二)

第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists也可以作为where语句的子查询,语法如下: SELECT --FROM 表名 WHERE  EXISTS(子查询): EXISTS关键字后面的参数是一个任意的子查询,如果该子查询没有返回行,则EXISTS子查询的结果为true,此时再执行外层查询语句.如果EXISTS子查询结果为false,此时外

HttpClient4.3教程 第四章 HTTP认证

HttpClient4.3教程 第四章 HTTP认证 Posted on 2013 年 10 月 17 日 HttpClient既支持HTTP标准规范定义的认证模式,又支持一些广泛使用的非标准认证模式,比如NTLM和SPNEGO. 4.1.用户凭证 任何用户认证的过程,都需要一系列的凭证来确定用户的身份.最简单的用户凭证可以是用户名和密码这种形式.UsernamePasswordCredentials这个类可以用来表示这种情况,这种凭据包含明文的用户名和密码. 这个类对于HTTP标准规范中定义的

mysql第四篇--SQL逻辑查询语句执行顺序

mysql第四篇--SQL逻辑查询语句执行顺序 一.SQL语句定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition&g

Flask 教程 第四章:数据库

本文翻译自 The Flask Mega-Tutorial Part IV: Database 在Flask Mega-Tutorial系列的第四部分,我将告诉你如何使用数据库. 本章的主题是重中之重!大多数应用都需要持久化存储数据,并高效地执行的增删查改的操作,数据库为此而生. 本章的GitHub链接为: Browse, Zip, Diff. Flask中的数据库 Flask本身不支持数据库,相信你已经听说过了. 正如表单那样,这也是Flask有意为之.对使用的数据库插件自由选择,岂不是比被迫