sqlalchemy orm复杂查询备忘录

本文介绍了使用SQLAlchemy进行复杂查询的方法,包括按年份筛选记录、将查询结果转换为dict格式、查找字段是否为空等实用技巧。

收录一些自己用过的sqlalchemy复杂查询以备忘

env: python flask sqlalchemy

case 1:搜索今年及去年的数据记录

编号格式为:PR-19-00001
编号中间的19为年份,需要根据年份来找出所有今年以及去年(18)的记录并排序
key point:or_contains()

from sqlalchemy import or_
import datetime, time

this_year_code = str(datetime.datetime.now().year)[2:4]
last_year_code = str(int(this_year_code) - 1)
projects = Projects.query.filter(or_(Projects.project_num.contains('PR-{}'.format(last_year_code)),
                                         Projects.project_num.contains('PR-{}'.format(this_year_code)))).order_by(
        Projects.project_num.desc()).all()
result查询对象转化为dict

db.session.query出的结果是result查询对象,如果是.first()就直接是result对象,如果是.all(),则是result的list
(1)db.session.query().filter().first()

requirements = db.session.query(RequirementList.id, DeviceCategory.type, DeviceCategory.name, DeviceCategory.specs,
                                    DeviceCategory.supplier, DeviceCategory.price, DeviceCategory.usage_scenarios,
                                    RequirementList.numbers, RequirementList.device_category_id,
                                    DeviceCategory.brand).join(DeviceCategory,
                                                               DeviceCategory.id == RequirementList.device_category_id).filter(
                                    RequirementList.order_id == order_id).all()
# 将result结果转化为dict
requirement_list = [dict(zip(r.keys(), r)) for r in requirements]   

(2)db.session.query().filter().all()

device = db.session.query(PurchaseList.cicode, PurchaseList.sn, DeviceCategory.name,
                                  DeviceCategory.specs,
                                  DeviceCategory.price, PurchaseList.kvm_ip, DeviceCategory.supplier,
                                  DeviceCategory.brand, PurchaseList.status).select_from(PurchaseList). \
            join(DeviceCategory, DeviceCategory.id == PurchaseList.device_category_id). \
            filter(PurchaseList.cicode == every_cicode).first()
# 将result list结果转化为dict的list
device_dict = dict(zip(device.keys(), device))
查找字段为空或者非空
# 查找字段为空的
db.session.query(employee).filter(employ.brand_id==None))

# 查找字段非空的
db.session.query(employee).filter(employ.brand_id.isnot(None))

# 查找字段非空2
from sqlalchemy import not_
db.session.query(user).filter(not_(employ.user==None))

或和并同时的查询条件
from sqlalchemy import or_, and_

db.session.query(devices).filter(or_(
	devices.name == None,
	and_(devices.status == 'delivered', devices.op == 'david')
))

多条件过滤查询
param = []
param.append(User.name == 'xiaoming')
param.append(User.city == 'shenzhen')
param.append([User.num.isnot(None), User.car == 'Focus')

db.session.query(User).filter(*param).all()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值