Peewee 高阶用法
Peewee 高阶用法
前言
本文介绍的Peewee方法语法基于PostgreSQL
高阶用法
- 元组多条件查询
from peewee import Tuple e.g.: 1. model.select().where(Tuple(model.id, model.name) == (1, '胖胖')) 2. model.select().where(Tuple(model.id, model.name).in_([(1, '胖胖1号'), (2, '胖胖2号')])
- 简单Case函数
from peewee import Case Number = Table('numbers', ('val',))num_as_str = Case(Number.val, ( # case_ value(1, 'one'), # (when_value1,结果1)(2, 'two'), # (when_value2,结果2)(3, 'three') # (when_value3,结果3)), 'a lot') # else后的结果query = Number.select(Number.val, num_as_str.alias('num_str'))The above is equivalent to: SELECT "val", CASE "val" WHEN 1 THEN 'one' WHEN 2 THEN 'two' WHEN 3 THEN 'three' ELSE 'a lot' END AS "num_str" FROM "numbers"
- Case搜索函数
from peewee import Case Number = Table('numbers', ('val',)) num_as_str = Case(None, ( # 用Case进行搜时,case_value为空,when中处理完整条件(Number.val == 1, 'one'), # (case1,结果1)(Number.val == 2, 'two'), # (case2,结果2)(Number.val == 3, 'three') # (case3,结果3)), 'a lot') # else后的结果 query = Number.select(Number.val, num_as_str.alias('num_str'))The above is equivalent to: SELECT "val", CASE WHEN "val" = 1 THEN 'one' WHEN "val" = 2 THEN 'two' WHEN "val" = 3 THEN 'three' ELSE 'a lot' END AS "num_str" FROM "numbers"
- 子查询
官网实例rank = fn.rank().over(order_by=[fn.SUM(Booking.slots).desc()]) # rank() over(order_by(sum(booking.slots desc)))subq = (Booking.select(Booking.facility, fn.SUM(Booking.slots).alias('total'),rank.alias('rank')).group_by(Booking.facility)) # Here we use a plain Select() to create our query. query = (Select(columns=[subq.c.facid, subq.c.total]) # columns: 查询出指定的字段(对查询结果集的字段进行操作时,需要在结果集后加上.c再.属性).from_(subq) # 规定用法.where(subq.c.rank == 1) # 查询结果集.c.字段属性.bind(db)) # We must bind() itto the database.# To iterate over the query results: for facid, total in query.tuples(): # tuples()可以按照select查询顺序,将每条查询结果处理成元组,并将数据整合成一个可迭代类型数据print(facid, total)
- 递归查询(WITH RECURSIVE)
官方文档实例base = (CommonUser.select(CommonUser.user_id).where(CommonUser.user_id == user_id).cte("common_users", recursive=True, columns=("user_id", 'user_name', 'superior_id'))) cu = CommonUser.alias("cu") recursive = (cu.select(cu.user_id).join(base, on=(base.c.user_id == cu.superior_id))) cte = base.union_all(recursive) query = (cte.select_from(cte.c.user_id).order_by(cte.c.user_id)) # 这段orm实现了以下sql功能 WITH RECURSIVE virtual_user (user_id,user_name,superior_id) AS (SELECT user_id,user_name,superior_id FROM common_user WHERE user_id=%sUNIONSELECT common_user.user_id,common_user.user_name,common_user.superior_id FROM common_user,virtual_userWHERE virtual_user.user_id=common_user.superior_id AND common_user.code_status=1) SELECT * FROM virtual_user WHERE user_name like %s ORDER BY convert_to(user_name,'GBK') ASC;
那么在我们项目中的应用呢?
按上面的例子,我们能得出来一些user_id。然后可以将这些user_ids作为查询条件,比如: Book.select().where(Book.author_id.in_(user_ids)),这样使用当然是可以的。但是在sql的查询中,in作为条件的查询效率是极其低效的,尤其当in中的元素很多时。 这时就应该想到用join来解决问题,于是base = (CommonUser.select(CommonUser.user_id,CommonUser.user_name,CommonUser.superior_id).where(CommonUser.user_id == 26).cte("common_users", recursive=True, columns=("user_id", "user_name", "superior_id"))) cu = CommonUser.alias("cu") recursive = (cu.select(cu.user_id,cu.user_name,cu.superior_id).join(base, on=(base.c.user_id == cu.superior_id))) cte = base.union_all(recursive) employees = (GcEmployee.select(GcEmployee.id, GcEmployee.name)# .with_cte(cte).join(cte, on=(GcEmployee.relation_user_id == cte.c.user_id))) 运行一下,结果会是什么呢?见下
Peewee 高阶用法相关推荐
- 【性能测试】如何用一条命令完全掌握linux系统性能监控(top高阶用法)
目 录 一 引 言 二 top命令高阶用法 场景1:采样3次,采样间隔为10s: 场景2:采样2h,采样间隔为10s,性能数据保存到test.csv文件中: 一 引 言 熟悉CentOS linux ...
- ifdef的用法_chisel 高阶用法简介--rocket-chip generator
本文将介绍chisel的三个高阶用法:diplomacy,cake pattern和参数化. diplomacy 什么是diplomacy?互联参数的自动协商. 痛点在哪里: 传统的SoC集成中,互联 ...
- python mockito arg_that_编程高阶用法–开发者高频词汇
开发者总会在开发时遇到变量命名困难或者命名冗长庸俗的时候. 阅读代码过程中遇到一些很好的命名,也遇到一些不好的. 当初并没有记录下来,之后才开始记录,有的也找不到出处了.以下高频词汇供有追求的开发者参 ...
- React之ref的高阶用法
forwardRef转发Ref forwardRef的初衷就是解决ref不能跨层级捕获和传递的问题,forwardRef接受了父级元素标记的ref信息,并把它转发下去,使得子组件可以通过props来接 ...
- day67 ORM模型之高阶用法整理,聚合,分组查询以及F和Q用法,附练习题整理
归纳总结的笔记: day67ORM特殊的语法一个简单的语法 --翻译成--> SQL语句语法:1. 操作数据库表 创建表.删除表.修改表2. 操作数据库行 增.删.改.查怎么连数据库:需要手动创 ...
- mysql的高阶用法_MySQL的经典用法(十四)-高级优化
mysql的经典用法(十四)----高级优化 基于 /application/search/mysql/mysql-5.5.28/support-files/my-innodb-heavy-4G.cn ...
- Nginx高阶用法(一)
Nginx 状态页 基于nginx模块ngx_http_auth_basic_module实现,在编译安装nginx的时候需要添加编译参数--with-http_stub_status_modul ...
- CASE WHEN 高阶用法?
两个表做关联时,以左表为准,若左表某列不为空,则与右表对应列进行关联匹配,为空则不做匹配. 以上做法,有一种说不出来的感觉,不管怎样,问题是解决了. 如有更好的解决思路,请留言告知,不甚感激! 转载于 ...
- void 型指针的高阶用法,你掌握了吗?
[导读] 要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用.测试环境采用 IAR for ARM 8.40.1 推荐一首中文歌曲<< ...
最新文章
- 如何看待那些互相矛盾的论文?
- java中抽象类的匿名子类和匿名对象
- Redis-序列化和存储模式
- 排序字段设计_「原创」第四章、模型设计
- [温故知新] 编程原则和模式
- C语言程序返回值为int的时候,不同值代表不同的意义
- JeecgBoot轻松解决ERP项目复杂布局需求,JVXETable高性能行表格效果和项目案例
- vb net的定时循环_Python3-定时任务的四种实现方式
- 仿博客园个人博客(3)基本完成
- 微信推出“腾讯QQ”小程序;马化腾又要发红包;GitLab 12.5 稳定版发布| 极客头条...
- [nsis]安装包反编译
- Asp.Net Ajax 之 取消异步PostBack( 一 )
- Redhat_as4_oracle10g自启动脚本设置
- Java虚拟机知识点【方法调用】
- Python:jieba库的介绍与使用
- 西门子PLC S7-1200程序实例,博图版本V15,仅供电气编程者学习借鉴
- (转)屈子:独立人格可与日月争光
- Java计算机毕业设计糖果销售管理系统源码+系统+数据库+lw文档
- Metasploitable2虚拟机镜像下载地址
- LK32T102单片机 操作GPIO实现 主按钮、矩阵按键 和 蜂鸣器
热门文章
- 【性能测试】如何用一条命令完全掌握linux系统性能监控(top高阶用法)
- 元组多条件查询