这里写目录标题

  • Python中常用的ORM框架
  • peewee使用经验
    • 从数据库中导出模型
    • 查询
      • 统计类查询
    • 优化子查询
  • 参考文章

Python中常用的ORM框架

  1. SQLALchemy:重量级框架,适合企业级开发,容易与任意Web框架集成,学习成本更高
  2. Django ORM:Django框架中内嵌的ORM模块,易学易用,只适合Django项目使用
  3. peewee:轻量级框架,适合个人开发,容易与任意Web框架集成,API类似Django风格,易学易用

peewee使用经验

基本的安装和使用参考官方文档

从数据库中导出模型

pwiz, a model generator
通过pip安装peewee会自动安装pwiz模块,使用pwiz模块导出模型(windows下注意带上第一个&符号):

& "E:\Program Files\Anaconda3\envs\project\python.exe" -m pwiz -e mysql -H 127.0.0.1 -p 3366 -u username -P -v database

查询

统计类查询

实现以下SQL:

select count(1) count, min(id) min, max(id) max from model where col is null;

对应的peewee查询:

query = Model.select(fn.count(1).alias('count'), fn.min(Model.id).alias('min'), fn.max(Model.id).alias('max')).where(Model.col.is_null()) # 这里只是定义查询,并不会执行SQL

返回Row对象:

result = query.get() # 如果查询结果集只有一条记录,可以使用get()直接读取,默认返回Row对象
# result = query.namedtuples().get()
print(result.count, result,min, result.max) # 通过对象属性直接访问查询结果

返回Tuple对象:

count, min, max = query.tuples().get()
print(count, min, max)

返回Dict对象:

result = query.dicts().get()
print(result['count'], result['min'], result['max'])

优化子查询

联表查询数据量较大时,可以使用子查询来优化查询性能,例如以下SQL:

select distinct p.id from
(select id, uid from table_a where (id between 100 and 1000) and (query_id is null) order by id limit(100)) p
left join table_b b on p.uid = b.uid
where b.type = 1 and b.distance = 0;

对应的peewee子查询:

p = (TableA.select(TableA.id.alias('id'), TableA.uid.alias('uid')).where((TableA.id.between(startId, endId)) & (TableA.query_id.is_null())).order_by(TableA.id).limit(100).alias('p'))

常规写法及其对应SQL:

p.select(TableA.id).distinct().left_outer_join(TableB, on=(TableA.uid == TableB.uid)).where((TableB.type == 1) & (WatchPoi.distance == 0))
SELECT DISTINCT `t1`.`id` FROM `table_a` AS `t1`
LEFT OUTER JOIN `table_b` AS `t2` ON (`t1`.`uid` = `t2`.`uid`)
WHERE (((`t1`.`id` BETWEEN 100 AND 1000) AND (`t1`.`query_id` IS NULL)) AND (`t2`.`type` = 1))
ORDER BY `t1`.`id` LIMIT 100

可以看到无法满足性能优化的要求,修改后的写法及其对应SQL:

p.select_from(p.c.id).distinct().left_outer_join(TableB, on=(p.c.uid == TableB.uid)).where((TableB.type == 1) & (WatchPoi.distance == 0))

或者

def resObject(id):res = Res()res.id = idreturn resSelect(from_list=[p], columns=[p.c.id], distinct=True).left_outer_join(TableB, on=(p.c.uid == TableB.poi_id)).where((TableB.type == 0) & (TableB.distance == 0)).bind(database).objects(resObject)

两种方式生成的SQL都是一样的:

SELECT DISTINCT `p`.`id` FROM
(SELECT `t1`.`id` AS `id`, `t1`.`uid` AS `uid` FROM `poi` AS `t1`
WHERE ((`t1`.`id` BETWEEN 100 AND 1000) AND (`t1`.`query_id` IS NULL))
ORDER BY `t1`.`id` LIMIT 100) AS `p`
LEFT OUTER JOIN `table_b` AS `t2` ON (`p`.`uid` = `t2`.`poi_id`)
WHERE ((`t2`.`type` = 0) AND (`t2`.`distance` = 0.0))

可以看到和我们想要的SQL是一样的。

相关API使用可以参考SelectQuery、BaseQuery、Select

参考文章

Python 常用的ORM框架简介
peewee的使用

Python轻量级ORM框架——peewee相关推荐

  1. Python的轻量级ORM框架peewee

    作者:小小明 在前面的<改变python对象的黑魔法metaclass>一文中,我介绍了使用metaclass自己编写ORM框架的思路. 地址:https://blog.csdn.net/ ...

  2. Python的ORM框架Peewee使用入门(二)

    人生的磨难是很多的,所以我们不可对于每一件轻微的伤害都过于敏感.在生活磨难面前,精神上的坚强和无动于衷是我们抵抗罪恶和人生意外的最好武器. 改数据,删数据 from datetime import d ...

  3. Python ORM框架peewee

    文章目录 简介 安装 初试 表的创建和插入数据 INSERT INTO ... VALUES (...) 表的删除 DROP TABLE 表的更新 ALTER TABLE 表的查询 SELECT .. ...

  4. 【python轻量级中台框架开发第一层】 ORM flask-sqlacodegen

    @[python](python轻量级中台框架开发第一层 ORM flask-sqlacodegen) 欢迎阅读,点评指正 任何系统或框架都离不开数据存储.所以任何的开始都是要保存下我们需要的东西. ...

  5. .NET轻量级ORM框架Dapper入门精通

    一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...

  6. c# 轻量级ORM框架 实现(一)

    c# 轻量级ORM框架 实现(一) 2018年09月04日 14:11:02 IT哈 阅读数:1245 发布一个自己写的一个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋 ...

  7. 重磅开源:基于.NET 6.0 自研轻量级ORM框架

    Fast Framework 项目:https://gitee.com/China-Mr-zhong/Fast.Framework 一.前言 1.为了实现快速开发,省去编写大量Sql时间,更好的面向对 ...

  8. 【ORM框架】Python ORM框架——peewee(详细)

    文章目录 前言 一.peewee的安装和入门 1.字段类型表&Meta类型表&类型属性表 字段类型表 Meta类型表 类型属性表 2.设计表结构 防止连接丢失 二.表的设计&操 ...

  9. 轻量级ORM框架 Bankinate

    [前言] 前面讲过ORM的前世今生,对ORM框架不了解的朋友可以参考博文:https://www.cnblogs.com/7tiny/p/9551754.html 今天,我们主要通过设计一款轻量级的O ...

最新文章

  1. for语句联系 -小九九乘法表
  2. 管道命令 (pipe)
  3. 视频技术详解:语音编解码技术演进和应用选型
  4. 160 - 11 Andrnalin.4
  5. oracle+资料类型不一致吗,oracle数据库中,字段类型不一致,导致查询慢
  6. 漫画通信:一图看懂通信发展史
  7. 微赞企动协会wac_xiehui3.0.9全开源版模块
  8. [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]
  9. C++的基础知识【面试遇到】
  10. Java基础学习笔记(五)Iterator
  11. OpenGL超级宝典第5版基础渲染
  12. Object中的clone方法
  13. 数学建模之层次分析法
  14. linux用dd命令刻录u盘,巧用linux dd命令刻录启动U盘
  15. 大学物理复盘 | 简明大学物理学第一章——质点运动学思维导图梳理(复习专用)
  16. Linux快速入门之一(基础)
  17. 工作分解结构(Work Breakdown Structure,简称WBS)
  18. Python Pycharm 对代码进行TODO标记注释
  19. Doxbox更改窗口大小
  20. iOS开发关于“发送原图”功能问题的记录

热门文章

  1. 分布式:分布式系统设计策略。
  2. 我的世界无限资源的服务器,我的世界无限资源单机版
  3. 内存分配者-动态内存
  4. 计算机计划实施800字,大学计划书范文800字3篇
  5. 解决达梦数据库如何查找表字段名。
  6. arcgis for js 画圆圈(会跟地图一起缩小),而不是打点然后加半径的圆点(不会缩小),制作打卡功能选点。可以点击地图自动画圆圈
  7. 英语如此简单(转贴)
  8. 国内怎么使用chatGpt
  9. 这些面试技巧,必须要掌握!
  10. 零伽壹链改研究:供应链金融潜能爆发,解密背后的区块链技术应用!