测开之路一百四十四:ORM之SQLAlchemy查询

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

查询

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_byfor 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)

# andfor 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()没有返回结果的时候不会抛异常,会返回noneprint(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 textfor dep in db.session.query(Department).filter(text(‘id < 3‘)).order_by(text(‘id desc‘)).all():    print(dep)

# 使用原生sql与sqlalchemy混用from sqlalchemy import textdata = 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 funcdata = db.session.query(func.count(Employee.gender), Employee.gender).group_by(Employee.gender).all()print(data)

原文地址:https://www.cnblogs.com/zhongyehai/p/11503744.html

时间: 2024-10-01 04:29:11

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

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

使用WTForms表单验证,可以在数据建模时就设置验证信息和错误提示 创建模型时,设置验证内容,如必填.格式.长度 from flask_wtf import Formfrom wtforms import StringField, PasswordField, BooleanFieldfrom wtforms import validators class UserRegForm(Form): username = StringField('用户名', [validators.DataRequ

测开之路一百二十六:flask之获取request请求数据

可以根据flask的request对象获取所有的请求信息 path = request.path # 获取请求地址method = request.method # 获取请求方法ip = request.remote_addr # 请求来源的ipform = request.form # 获取form表单的数据value = request.values # 获取查询字符串/表单数据headers = request.headers # 后区头部信息User_Agent = request.he

测开之路一百二十五:flask之urlencode参数传递和解析

当get请求传参时,用?分隔参数和域名,用&分隔参数,如果参数里面本身就有&符号就会识别不出来,还是会当成分隔符,所以这些数据在传输的时候,就需要转义,现在普遍是转成urlencode编码:%20%xx%23 在jinja2模板里面,可以使用 data|urlencode 发送urlencode编码,而python里面又有urllib.parse.unquote()可以解析urlencode编码 视图函数 html:访问"/"返回html,在html上面点击超链接时请求

测开之路一百二十九:jinja2模板语法

flask用的是jinja2模板,有自己特定的语法 形参: 在html里面留占位参数: {{ 参数名 }},后端传值时,参数名=参数值 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>b页面</title></head><body> <h1>{{ user }},你好<

测开之路一百三十六:错误消息闪回提示

错误消息提示:flask.flash 视图 app.secret_key = 'qoihf2397r21380r2/./ad' # 加密的安全码,越复杂越好,flask后台自动进行加密 @app.route('/login/', methods=['GET', 'POST'])def login(): """ 登录 """ if request.method == 'POST': username = request.form.get('user

测开之路一百三十八:会话管理之session

session管理和使用,需要用到flask的session模块和设置安全码:app.secret_key 比如列表页和编辑功能只能给admin用 列表页 编辑页 添加session 登录成功时,把username添加到session里面 app.secret_key = 'qoihf2397r21380r2/./ad' # 加密的安全码,越复杂越好,flask后台自动进行加密 @app.route('/login/', methods=['GET', 'POST'])def login():

测开之路一百四十一:蓝图实现程序模块化

把每一个模块独立出来,然后在主app里面注册,这样就实现了模块之间互不干扰 新建蓝图 artcle.views.py """article蓝图"""from flask import request, render_template, redirect, url_forfrom flask import Blueprint article = Blueprint('article', __name__) @article.route('/arti

测开之路一百四十七:用WTForms实现编辑功能

接上一篇的内容 把原先的数据库模型全部给默认值,后面form赋值的时候就不用传位置参数了 把视图逻辑修改一下 # 视图层from datetime import datetimefrom flask.views import MethodViewfrom flask import render_template, redirect, url_for, request from personal.models import db, Employee, Departmentfrom personal

测开之路一百五十二:基于jquery的ajax实现(load、get、ajax)

ajax除了用原生的js实现之外,也可以使用jquery实现,而且用jquery更方便 看一个简单的示例,保留上一篇的content路由和html,实现上一篇一样的功能,点击获取内容,局部刷新 准备一个页面用于被调用 <h1>这是content.html的h1标签</h1><p style="background: red"> 这是content.html的p标签,红色 <a href="https://www.baidu.com/&