在上一篇的基础上,插入数据

查询

Department.query.all() # 用表对象查
db.session.query(Department).all() # 用db对象查

查询前两条,直接python截取前两条数据

排序

默认升序:order_by(排序的字段名)

倒序:从sqlalchemy导入desc

查询单个指定字段

查询多个指定字段

只用一个变量接收多个查询结果的时候,SQLAlchemy默认用namedtuple进行命名处理

namedtuple结构:

别名:label(别名)

限制查询返回数量:limit()

和排序组合用

跳过一部分,分页需要用到此功能:offset()

查询指定条件:filter_by(name='xxx')

也可以用面向对象的形式:filter(对象.xxx=='xxx')

使用python语法模糊查询:

包含:contains()

以xx开始:startwith()

以xx结尾:endwith()

比较:直接写运算符

多条件:无限.filter(),每家一个条件就加一个.filter()

由于.filter()和.filter_by()需要依附query对象,而.filter()和.filter_by()本身返回的就是query对象,所以可以无限过滤下去

联合查询:从Employee里面找出Department.name == '技术部'的数据

框架的模糊查询:

.like(%%)

in

not in,取反

取某个字段为空的数据

取某个字段不为空的数据:isnot(),或者取反

and:filter()里面加条件默认是and

也可以多个filter筛选

sqlalchemy自带的and,需导入

或:sqlalchemy自带的or,需导入

取查询的第一个:first()、one()、one_or_none()

单个值:scalar()

使用原本的sql片段,需要从sqlalchemy导入text():from sqlalchemy import text

sqlalchemy与sql混用

查询个数:count()

也可以使用sqlalchemy自带的func.count()

from pms.models import *

all = Department.query.all()  # 用表对象查
print(all)
all_department = db.session.query(Department).all() # 用db对象查
print(all_department)
for d in all:
print(f'{d.id}-->{d.name}') for d in Department.query.all()[:2]:
print(f'{d.id}-->{d.name}') # 默认升序
for d in db.session.query(Department).order_by(Department.id):
print(f'{d.id}-->{d.name}') # 倒序
from sqlalchemy import desc for n in db.session.query(Department).order_by(desc(Department.id)): # 根据部门倒序排,取前两条
print(n) for i in db.session.query(Department.id): # 查询id字段
print(i) for n in db.session.query(Department.name): # 查询name字段
print(n) for i, n in db.session.query(Department.id, Department.name): # 查询多个指定字段
print(f'{i}--{n}') for row in db.session.query(Department.id, Department.name): # 查询多个指定字段, 返回SQLAlchemy的类型
print(f'{type(row)}:\n{row}')
print(f'{row.id}-->{row.name}') # 取值时不用下标,用对象方式 # namedtuple,类似数据库结构
from collections import namedtuple name = namedtuple('Book', ['title', 'price', 'auther'])
book1 = name('python', 30, 'aaa')
print(f'{book1.title}、{book1.price}、{book1.auther}') for n in db.session.query(Department.name.label("部门")): # 查询name字段
print(n.部门) for n in Department.query.limit(2): # 前两条
print(n) for n in db.session.query(Department).order_by(Department.id).limit(2): # 根据部门升序排,取前两条
print(n) for n in db.session.query(Department).order_by(Department.id).offset(2).limit(2): # 根据部门升序排,跳过两条,再取前两条
print(n) # 查询指定内容:filter_by
for d in db.session.query(Department).filter(Department.name == '技术部'):
print(d) for d in db.session.query(Department).filter_by(name='技术部'):
print(d) # 模糊查询,python语法
for d in db.session.query(Department).filter(Department.name.contains('技')):
print(d) for d in Department.query.filter(Department.name.startswith('财')):
print(d) for d in Department.query.filter(Department.name.endswith('部')):
print(d) for d in Department.query.filter(Department.id > 3):
print(d) for d in Department.query.filter(Department.id > 3).filter(Department.name.contains('市场部')):
print(d) for d in Department.query.filter(Department.id > 3).filter_by(name='市场部'):
print(d) # 联合查询
for emp in db.session.query(Employee).filter(Department.name == '技术部'):
print(emp) for emp in db.session.query(Employee).filter(Department.name == '技术部'):
print(emp) for d in db.session.query(Department).filter(Department.name.like('%术%')):
print(d) # 第二个字是术的,一个横线代表一个位置
for d in db.session.query(Department).filter(Department.name.like('_术%')):
print(d) for d in db.session.query(Department).filter(Department.name.like('技%')):
print(d) for d in db.session.query(Department).filter(Department.name.like('%部')):
print(d) for d in db.session.query(Department).filter(Department.name.in_(['技术部', '财务部'])):
print(d) for d in db.session.query(Department).filter(~Department.name.in_(['技术部', '财务部'])):
print(d) for d in db.session.query(Employee).filter(Employee.name.is_(None)):
print(d) for d in db.session.query(Employee).filter(Employee.name == None):
print(d) for d in db.session.query(Employee).filter(Employee.name.isnot(None)):
print(d) for d in db.session.query(Employee).filter(~Employee.name.is_(None)):
print(d) # and
for d in db.session.query(Department).filter(Department.name.endswith('部'), Department.id == 1):
print(d)
for d in db.session.query(Department).filter(Department.name.endswith('部')).filter(Department.id == 1):
print(d)
from sqlalchemy import and_
for d in db.session.query(Department).filter(and_(Department.name.endswith('部'), Department.id == 1)):
print(d) # 或
from sqlalchemy import or_
for d in db.session.query(Department).filter(or_(Department.name.startswith('技'), Department.id == 2)):
print(d) # 取第一个:
# first(),性能最优,且没有结果的时候返回空,不会抛异常
print(db.session.query(Department).order_by(desc(Department.id)).first())
# one():没有返回结果的时候会抛异常
print(db.session.query(Department).order_by(desc(Department.id)).one())
# one_or_none()没有返回结果的时候不会抛异常,会返回none
print(db.session.query(Department).order_by(desc(Department.id)).one_or_none()) # 一行一列,单个值 scalar()
print(db.session.query(Department.id).filter(Department.name == '技术部').scalar()) # 使用原生sql条件片段:text(片段)
from sqlalchemy import text
for dep in db.session.query(Department).filter(text('id < 3')).order_by(text('id desc')).all():
print(dep) # 使用原生sql与sqlalchemy混用
from sqlalchemy import text
data = db.session.query(Department).from_statement(text('select * from department where name=:n')).params(n='技术部').one()
print(data)
stmt = text('select id, name, salary from employee where name=:name')
stmt = stmt.columns(Employee.id, Employee.name, Employee.salary)
data = db.session.query(Employee).from_statement(stmt).params(name='tom2').all()
print(data) # 查询个数:count()
print(db.session.query(Department).count())
print(db.session.query(Employee).filter(Employee.name.startswith('t')).count()) from sqlalchemy import func
data = db.session.query(func.count(Employee.gender), Employee.gender).group_by(Employee.gender).all()
print(data)

测开之路一百四十四:ORM之SQLAlchemy查询的更多相关文章

  1. 测开之路一百五十四:ajax+json前后台数据交互

    在实际工作中,前后端数据交互大部分都是用的json格式,后端把数据处理完后,把json传给前端,前端再解析 项目结构 models里面加入把数据转为字典的方法 from datetime import ...

  2. 测开之路一百四十九:jinja2模板之宏

    jinja2是python的模板引擎, 在写python web使用的过程中,macro可以节省大量的代码 比如上一篇的渲染页面 <!DOCTYPE html><html lang= ...

  3. 测开之路一百四十八:WTForms表单验证

    使用WTForms表单验证,可以在数据建模时就设置验证信息和错误提示 创建模型时,设置验证内容,如必填.格式.长度 from flask_wtf import Formfrom wtforms imp ...

  4. 测开之路一百四十六:WTForms之表单应用

    WTForms主要是两个功能:1.生成HTML标签  2.对数据格式进行验证 官网:https://wtforms.readthedocs.io/en/stable/ 这篇介绍用wtform生成htm ...

  5. 测开之路一百四十五:SQLAlchemy与后台模板整合之新增、查询、删除

    实现在页面上点击展示页就展示内容,点击新增页就触发新增功能 项目结构 admin.__init__ from flask import Blueprint admin = Blueprint('adm ...

  6. 测开之路一百四十二:ORM框架之SQLAlchemy建库、建表、数据库操作

    flask-SQLAlchemy是在原生SQLAlchemy的基础之上做了一层封装,安装flask-SQLAlchemy会自动安装SQLAlchemy 安装 传统的sql建表建字段 通过flask-S ...

  7. 测开之路一百二十四:flask之MVC响应过程

    MVC流程 原本的请求响应 结构: 视图: from flask import Flask, render_template app = Flask(__name__) @app.route(&quo ...

  8. 测开之路一百四十三:ORM框架之SQLAlchemy模型及表创建

    基于前一篇内容,可以使用模型的结构 目录结构 main,入口层 from flask import Flaskfrom flask_sqlalchemy import SQLAlchemy app = ...

  9. 测开之路一百五十五:jquery-validation前台数据验证

    前面做的wtform验证是服务器端的验证,需要把数据传输到服务器,服务器验证后再吧结果传输到前端,网络慢的时候,用户体验不好,所以需要前端验证,且后端验证不能少 传统的js或者jquery如果要验证信 ...

随机推荐

  1. GDAL支持中文路径和Shp文件中文属性写入

    在使用GDAL的过程中,为了支持中文,比需手动进行中文路径的设置,同时特别是在对Shp的属性进行中文输入的时候,都必须进行必要的设定. 为了支持中文路径,在注册了驱动之后,加上第三句就可以了.必须设置 ...

  2. dedecms织梦调用二级和三级分类标签

    dedecms调用二级.三级以及调用栏目所有子栏目 <!--频道分类具体内容开始--> <div class="channel_sort"> {dede:c ...

  3. [易学易懂系列|rustlang语言|零基础|快速入门|(9)|Control Flows流程控制]

    [易学易懂系列|rustlang语言|零基础|快速入门|(9)] 有意思的基础知识 Control Flows 我们今天再来看看流程控制. 条件控制 if-else if -else: / Simpl ...

  4. source insight支持查看makefile、kconfig以及.s代码方法

    在用sourceinsight查看linux内核源码的时候,大家会发现不能查看源码中的makefile和kconfig代码,即不能搜索到makefile和kconfig文件.这是因为source in ...

  5. Linux中profile(转载)

    原文地址:http://www.cnblogs.com/mmfzmd517528/archive/2012/07/05/2577988.html 标黄是个人批注. 环境变量就是一个系统变量,系统配置一 ...

  6. (转)分布式锁的几种使用方式(redis、zookeeper、数据库)

    https://blog.csdn.net/u010963948/article/details/79006572

  7. cssfloat布局以及其他小技巧

    css float 布局以及其他小技巧总结 这篇博文 前面四个部分是关于css 经典布局 如果你已经知道了 可以直接跳过看第六部分 css 的其他小技巧 1.0 左右居中布局 <!DOCTYPE ...

  8. Python 分页和shell命令行模式

    前言 除了手动添加你的文章后外,你还可以用命令行来添加,python 自带了一种命令行 就是 shell 快速添加博文:Shell命令行模式 在你的目录下:mysite python manage.p ...

  9. 20180804 excel规划求解。。。

    把一个已经变量更出数据去求解

  10. 为什么second是秒也是第二?

    起源 早期在西方,一小时分为 60 分钟.后来,科学发达了.文明进步了,人们认为一分钟太粗放了.必须划分得更细致,于是就把一分钟划分成 60 等分.由于是对时间的第二次划分,就将新的 60 等分的“单 ...