Python轻量级ORM框架——peewee
这里写目录标题
- Python中常用的ORM框架
- peewee使用经验
- 从数据库中导出模型
- 查询
- 统计类查询
- 优化子查询
- 参考文章
Python中常用的ORM框架
- SQLALchemy:重量级框架,适合企业级开发,容易与任意Web框架集成,学习成本更高
- Django ORM:Django框架中内嵌的ORM模块,易学易用,只适合Django项目使用
- 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相关推荐
- Python的轻量级ORM框架peewee
作者:小小明 在前面的<改变python对象的黑魔法metaclass>一文中,我介绍了使用metaclass自己编写ORM框架的思路. 地址:https://blog.csdn.net/ ...
- Python的ORM框架Peewee使用入门(二)
人生的磨难是很多的,所以我们不可对于每一件轻微的伤害都过于敏感.在生活磨难面前,精神上的坚强和无动于衷是我们抵抗罪恶和人生意外的最好武器. 改数据,删数据 from datetime import d ...
- Python ORM框架peewee
文章目录 简介 安装 初试 表的创建和插入数据 INSERT INTO ... VALUES (...) 表的删除 DROP TABLE 表的更新 ALTER TABLE 表的查询 SELECT .. ...
- 【python轻量级中台框架开发第一层】 ORM flask-sqlacodegen
@[python](python轻量级中台框架开发第一层 ORM flask-sqlacodegen) 欢迎阅读,点评指正 任何系统或框架都离不开数据存储.所以任何的开始都是要保存下我们需要的东西. ...
- .NET轻量级ORM框架Dapper入门精通
一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...
- c# 轻量级ORM框架 实现(一)
c# 轻量级ORM框架 实现(一) 2018年09月04日 14:11:02 IT哈 阅读数:1245 发布一个自己写的一个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋 ...
- 重磅开源:基于.NET 6.0 自研轻量级ORM框架
Fast Framework 项目:https://gitee.com/China-Mr-zhong/Fast.Framework 一.前言 1.为了实现快速开发,省去编写大量Sql时间,更好的面向对 ...
- 【ORM框架】Python ORM框架——peewee(详细)
文章目录 前言 一.peewee的安装和入门 1.字段类型表&Meta类型表&类型属性表 字段类型表 Meta类型表 类型属性表 2.设计表结构 防止连接丢失 二.表的设计&操 ...
- 轻量级ORM框架 Bankinate
[前言] 前面讲过ORM的前世今生,对ORM框架不了解的朋友可以参考博文:https://www.cnblogs.com/7tiny/p/9551754.html 今天,我们主要通过设计一款轻量级的O ...
最新文章
- for语句联系 -小九九乘法表
- 管道命令 (pipe)
- 视频技术详解:语音编解码技术演进和应用选型
- 160 - 11 Andrnalin.4
- oracle+资料类型不一致吗,oracle数据库中,字段类型不一致,导致查询慢
- 漫画通信:一图看懂通信发展史
- 微赞企动协会wac_xiehui3.0.9全开源版模块
- [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]
- C++的基础知识【面试遇到】
- Java基础学习笔记(五)Iterator
- OpenGL超级宝典第5版基础渲染
- Object中的clone方法
- 数学建模之层次分析法
- linux用dd命令刻录u盘,巧用linux dd命令刻录启动U盘
- 大学物理复盘 | 简明大学物理学第一章——质点运动学思维导图梳理(复习专用)
- Linux快速入门之一(基础)
- 工作分解结构(Work Breakdown Structure,简称WBS)
- Python Pycharm 对代码进行TODO标记注释
- Doxbox更改窗口大小
- iOS开发关于“发送原图”功能问题的记录