Peewee:Python 简洁强大的 ORM 框架

news/2025/1/15 22:52:06/文章来源:https://www.cnblogs.com/wang_yb/p/18673860

Python 的开发世界中,数据库操作是至关重要的一环。

今天介绍的 Peewee 作为一款简洁且功能强大的 ORM(对象关系映射)框架,为开发者提供了高效便捷的数据库交互方式。

1. Peewee概述

Peewee 是一个简单小巧的 ORM,它的概念简洁明了,易于学习和使用。

能够与 SQLiteMySQLMariaDBPostgreSQL 等多种数据库协同工作,拥有丰富的扩展功能,其源代码托管于 GitHub-peewee。

使用过Python的都知道,SQLAlchemy几乎已经是Python中的标准ORM框架了,功能强大,

为什么还要使用Peewee呢?

首先,Peewee 设计更为简洁,其 API 简单直观,学习曲线平缓,新手能快速上手,而 SQLAlchemy 相对复杂,需要花费更多时间去掌握。

其次,Peewee 代码量较少,在一些简单项目中,其轻量级的特点能使项目结构更清晰,开发效率更高。

例如在小型数据库应用场景下,Peewee 能快速搭建起数据操作模块。

再者,Peewee 的性能在特定场景下表现出色,如对 SQLite 数据库的操作,其资源占用相对较低,能为应用带来更好的运行效果。

总之,如果项目规模不大,或者做一些小工具,那么Peewee 会更加趁手。

2. 快速上手

2.1. 初始化数据库

针对不同的数据库类型,有相应的初始化方式。

下面我们选择使用SQLite

from peewee import SqliteDatabasedb = SqliteDatabase('my_database.db')

2.2. 模型定义

Peewee 中,通过定义类来创建模型,类的属性对应数据库表中的字段。例如:

from peewee import Model, CharField, IntegerFieldclass User(Model):class Meta:database = dbusername = CharField(unique=True)age = IntegerField()

2.3. 创建数据库和表

连接数据库,然后就可通过SqliteDatabase来创建表。

if __name__ == "__main__":db.connect()db.create_tables([User])

执行之后,就会发现创建了sqlite数据库和表。

$  sqlite3.exe .\my_database.db
SQLite version 3.45.3 2024-04-15 13:34:05 (UTF-16 console I/O)
Enter ".help" for usage hints.
sqlite> .tables
user

db.create_tables反复执行也没关系,如果表已经存在,不会重复创建。

2.4. 数据存储与检索

存储数据时,先创建模型实例并赋值,然后调用 save 方法即可将数据保存到数据库。

if __name__ == "__main__":user = User(username="Harry", age=23)user.save()

运行之后,查询数据库,发现数据已经写入了数据库。

sqlite> select * from user;
┌────┬──────────┬─────┐
│ id │ username │ age │
├────┼──────────┼─────┤
│ 1  │ Harry    │ 23  │
└────┴──────────┴─────┘

检索数据可以使用各种查询方法。如获取单个记录:

user = User.get(User.username == "Harry")
print(f"name: {user.username}, age: {user.age}")# 运行结果:
# name: Harry, age: 23

2.5. 更新记录

更新记录,比如将上面的年龄改为30。

User.update(age=30).where(User.username == 'Harry').execute()

运行之后:

sqlite> select * from user;
┌────┬──────────┬─────┐
│ id │ username │ age │
├────┼──────────┼─────┤
│ 1  │ Harry    │ 30  │
└────┴──────────┴─────┘

2.6. 删除记录

删除记录也很简单:

User.delete().where(User.username == 'Harry').execute()

运行之后:

sqlite> select * from user;
sqlite> select count(1) from user;
┌──────────┐
│ count(1) │
├──────────┤
│ 0        │
└──────────┘

3. 高级查询功能

高级的查询功能包括多条件过滤,排序以及分页查询等等。

3.1. 批量插入数据

为了演示高级查询功能,先批量插入一批数据。

User.insert_many(users, fields=[User.username, User.age]).execute()

运行结果:

sqlite> select * from user;
┌────┬──────────┬─────┐
│ id │ username │ age │
├────┼──────────┼─────┤
│ 1  │ harry    │ 23  │
│ 2  │ lily     │ 20  │
│ 3  │ tom      │ 35  │
│ 4  │ jerry    │ 12  │
│ 5  │ kate     │ 42  │
└────┴──────────┴─────┘

3.2. 多条件查询

多个条件的交集,比如id>2并且age>30的数据:

users = User.select().where((User.id > 2) & (User.age > 30)).execute()print("满足条件的用户:")
for u in users:print(f"{u.username}: {u.age}")

运行结果:

$  python.exe .\main.py
满足条件的用户:
tom: 35
kate: 42

多个条件的并集,比如id>4或者age>20的数据:

users = User.select().where((User.id > 4) | (User.age > 20)).execute()

运行结果:

$  python.exe .\main.py
满足条件的用户:
harry: 23
tom: 35
kate: 42

3.3. 排序

按照年龄增长排序:

users = User.select().order_by(User.age)

运行结果:

$  python.exe .\main.py
按照年龄增长排序:
jerry: 12
lily: 20
harry: 23
tom: 35
kate: 42

按照年龄减少方向排序:

users = User.select().order_by(User.age.desc())

运行结果:

$  python.exe .\main.py
按照年龄减少排序:
kate: 42
tom: 35
harry: 23
lily: 20
jerry: 12

3.4. 分页查询

最后,再来看看分页查询,这在前端展示大规模数据时非常有用。

一般的ORM会通过SQL语句中的limitoffset来实现分页查询,而Peewee直接提供了分页查询的API。

page_number = 1 # 页序号,从1开始
page_size = 3  # 每页数据的数量users = User.select().paginate(page_number, page_size)
print(f"第{page_number}页数据:")
for u in users:print(f"{u.username}: {u.age}")

运行结果:

$  python.exe .\main.py
第1页数据:
harry: 23
lily: 20
tom: 35

这样就显示了前3个数据,如果把上面的page_numberg=2,那么会返回剩下的2条数据。

4. 总结

Peewee 还拥有众多扩展,如 Playhouse 提供了更多高级功能,包括对不同数据库的特定扩展(如 SQLite 的扩展函数)、模型生成工具、数据库迁移工具、反射功能等,大大增强了 Peewee 的实用性和灵活性。

本篇介绍的是最基本的使用方法,其他还有多表之间关系的建立和查询,请参考官方的文档。

总之,Peewee 以其简洁的语法、丰富的功能和良好的扩展性,成为 Python 开发者在数据库操作方面的有力工具,无论是小型项目还是大型应用,都能提供高效可靠的数据库交互支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/869821.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

floor_plan_meshproject增加角度正则损失

数据结构 data.x #(128, 16) 16 = triangles(9) + confidence(7) """ 每个元素 [x1, y1, z1, x2, y2, z2, x3, y3, z3, c_v1, c_v2, c_v3, c_e1, c_e2, c_e3, c_f] """ data.y #(128)encoded_x #(128, 576) encoded_x_conv # (2, 96, 576) …

2025.1.15 html基础

学习了html的基础知识,包括:n越大,字体越小换行标签表示一个完整的段落水平线标签链接: 内容 例如: <! --a页面-->这是A页面。<! --b页面-->这是B页面。在浏览器中点击“这是A页面”,会跳转到b页面。

位图有关的格式信息

GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bmp); 获取 HBITMAP 句柄包含的位图信息结构,不包含像素数据内容。 typedef struct tagBITMAP {   LONG bmType; // 位图类型,必须为 0   LONG bmWidth; // 位图宽度(以像素为单位) …

Centos7.9安装kerberos

Centos7.9安装kerberos@目录一、背景二、Kerberos安装部署2.1kerberos服务端必要软件安装2.2配置krb5.conf2.3配置kdc.conf2.4配置kadm5.acl2.5创建Kerberos数据库2.6启动Kerberos服务2.7创建Kerberos管理员principal2.8客户端安装kerberos2.9Kerberos功能验证本人其他相关文章…

并发编程 - 初识线程

线程是操作系统单独执行任务的最小单元,分前台和后台,有优先级,经历多个状态。C#可设置线程优先级和类型,控制线程状态的方法有Start、Sleep等,但Suspend和Abort已被弃用。多线程编程需通过同步机制控制线程执行。01、什么是线程? 要深刻理解什么是线程,就需要了解计算机…

Wgpu图文详解(05)纹理与绑定组

前言 什么是纹理? 纹理是图形渲染中用于增强几何图形视觉效果的一种资源。它是一个二维或三维的数据数组,通常包含颜色信息,但也可以包含其他类型的数据,如法线、高度、环境光遮蔽等。纹理的主要目的是为几何图形的表面提供详细的视觉效果,使其看起来更加真实和复杂。而我…

DeepSeek V3:AI 模型的游戏规则改变者

DeepSeek V3:AI 模型的游戏规则改变者 什么是DeepSeek V3? DeepSeekDeepSeek V3:AI 模型的游戏规则改变者什么是DeepSeek V3? DeepSeek V3是一款具有革命性的混合专家(MoE)模型,总参数达6710亿,每个标记激活370亿参数 。MoE方法允许多个专门模型(即“专家”)在门控网…

Opencv 的下载安装和VisualStudio配置

本文详细介绍了Windows系统下Opencv 的下载安装和VisualStudio配置过程。Opencv 的下载安装和VisualStudio配置 1 opencv-windows的下载 1.1 github直接下载链接(需要外网链接) 最新4.10.0版本的下载链接为: https://github.com/opencv/opencv/releases/download/4.10.0/openc…

G1原理—8.如何优化G1中的YGC

大纲 1.5千QPS的数据报表系统发生性能抖动的优化(停顿时间太小导致新生代上不去) 2.由于产生大量大对象导致系统吞吐量降低的优化(大对象太多频繁Mixed GC) 3.YGC其他相关参数优化之TLAB参数优化 4.YGC其他相关参数优化之RSet、PLAB和大对象的处理优化1.5千QPS的数据报表系统发…

【JavaSecLab靶场】Java综合漏洞平台

免责声明: 请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。在我们平时的网络安全工作中,经常会面对各种各样的挑战。比如,进行定期的漏洞扫描、代码审计,甚至是参与红蓝对抗演练时,发现漏洞后往往需要及时将其修复。 最近,我接触到了一款开…

黑群晖最新安装方式|RR新手

引导盘制作 1、下载最新的黑群晖引导镜像原版链接:wjz304/rr 百度云盘:链接:https://pan.baidu.com/s/12z3v_kVYUDdWNzWBWN_NTQ?pwd=e67k2、将下载好的压缩包解压,得到一个后缀为img的文件。3、使用写盘工具Rufus将镜像文件写到u盘中,点击选择,找到解压好后缀为img的文件…

【Node.js渗透】安装与检测基于Electron的应用程序

免责声明: ⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!三、说明 传送门:【Node.js开发】Electron 框架介绍,我们已经了解了创建简单Electron应用程序的过程。 本文将…