在 Python
的开发世界中,数据库操作是至关重要的一环。
今天介绍的 Peewee
作为一款简洁且功能强大的 ORM
(对象关系映射)框架,为开发者提供了高效便捷的数据库交互方式。
1. Peewee概述
Peewee
是一个简单小巧的 ORM
,它的概念简洁明了,易于学习和使用。
能够与 SQLite
、MySQL
、MariaDB
、PostgreSQL
等多种数据库协同工作,拥有丰富的扩展功能,其源代码托管于 GitHub-peewee。
使用过Python
的都知道,SQLAlchemy
几乎已经是Python
中的标准ORM
框架了,功能强大,
为什么还要使用Peewee
呢?
首先,Peewee
设计更为简洁,其 API 简单直观,学习曲线平缓,新手能快速上手,而 SQLAlchemy
相对复杂,需要花费更多时间去掌握。
其次,Peewee
代码量较少,在一些简单项目中,其轻量级的特点能使项目结构更清晰,开发效率更高。
例如在小型数据库应用场景下,Peewee
能快速搭建起数据操作模块。
再者,Peewee
的性能在特定场景下表现出色,如对 SQLite
数据库的操作,其资源占用相对较低,能为应用带来更好的运行效果。
总之,如果项目规模不大,或者做一些小工具,那么Peewee
会更加趁手。
2. 快速上手
2.1. 初始化数据库
针对不同的数据库类型,有相应的初始化方式。
下面我们选择使用SQLite
:
from peewee import SqliteDatabase db = SqliteDatabase('my_database.db')
2.2. 模型定义
在 Peewee
中,通过定义类来创建模型,类的属性对应数据库表中的字段。例如:
from peewee import Model, CharField, IntegerField class User(Model): class Meta: database = db username = 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
语句中的limit
和offset
来实现分页查询,而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
开发者在数据库操作方面的有力工具,无论是小型项目还是大型应用,都能提供高效可靠的数据库交互支持。