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 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语句中的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 开发者在数据库操作方面的有力工具,无论是小型项目还是大型应用,都能提供高效可靠的数据库交互支持。

Peewee:Python 简洁强大的 ORM 框架的更多相关文章

  1. Mego(2) - NET主流ORM框架分析

    接上文我们测试了各个ORM框架的性能,大家可以很直观的看到各个ORM框架与原生的ADO.NET在境删改查的性能差异.这里和大家分享下我对ORM框架的理解及一些使用经验. ORM框架工作原理 典型ORM ...

  2. Mego(03) - ORM框架的新选择

    前言 从之前的两遍文章可以看出ORM的现状. Mego(01) - NET中主流ORM框架性能对比 Mego(02) - NET主流ORM框架分析 首先我们先谈下一个我们希望的ORM框架是什么样子的: ...

  3. Python ORM框架之SQLAlchemy

    前言: Django的ORM虽然强大,但是毕竟局限在Django,而SQLAlchemy是Python中的ORM框架: SQLAlchemy的作用是:类/对象--->SQL语句--->通过 ...

  4. Python 常用的ORM框架简介

    ORM概念ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去.这样,我们在具体的操作实体对象的时候,就不需 ...

  5. Python操作mysql之SQLAchemy(ORM框架)

    SQLAchemy SQLAchemy 解析: SQLAchemy是python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作, 简言之便是:将对象转换成SQ ...

  6. Python操作redis、memcache和ORM框架_Day13

    一.memcache Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速 ...

  7. Excelbatis-一个将excel文件读入成实体列表、将实体列表解析成excel文件的ORM框架,简洁易于配置、可扩展性好

    欢迎使用Excelbatis! github地址:https://github.com/log4leo/Excelbatis Excelbatis的优点 和spring天然结合,易于接入 xsd支持, ...

  8. python(十二)下:ORM框架SQLAlchemy使用学习

    此出处:http://blog.csdn.net/fgf00/article/details/52949973 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 ...

  9. python——type()、metaclass元类和精简ORM框架

    1.type()函数 if __name__ == '__main__': h = hello() h.hello() print(type(hello)) print(type(h)) Hello, ...

  10. python的ORM框架SQLAlchemy

    本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业  一.ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句 ...

随机推荐

  1. 对于特定的游戏问题使用启发式算法可以取得比AI算法更好的表现

    相关: Using A.I. to DOMINATE NERDS in TETRIS 有些问题的求解可以通过建模将其转换为强化学习问题,然后再使用强化学习算法对其进行求解,但是很多问题如果不建模为强化 ...

  2. 命运的X

    命运的X cjx 生成函数强. 思路 首先,设 \(f_i\) 为添加第 \(i\) 项后满足条件的概率,\(g_i\) 任意添加至第 \(i\) 项的概率. 我们要求的答案: \[ans=\sum_ ...

  3. 连接数据库报错的异常可以用mysqli_report来捕获

    有时候数据库密码改了或者数据库删了,就会有一个mysqli的链接报错,是因为直接使用了类似代码 $connection = new mysqli('127.0.0.1', 'test_user', ' ...

  4. 功能齐全的 WPF 自定义控件资源库(收藏版)

    前言 推荐一款界面美观.功能齐全的 WPF 自定义控件资源库.这款资源库通过封装一系列常用的控件,简化开发流程,加快项目交付速度. 控件介绍 资源库封装了一些常用的控件,将其整合到一个自定义的控件库中 ...

  5. Spring常见面试问题

    Spring 1.  Spring工作机制及为什么要用? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.Spring既是一个AOP框架,也是一IOC容器. SpringFra ...

  6. gitlab之配置文件.gitlab-ci.yml

    自动化部署給我们带来的好处 自动化部署的好处体现在几个方面 1.提高前端的开发效率和开发测试之间的协调效率 Before 如果按照传统的流程,在项目上线前的测试阶段,前端同学修复bug之后,要手动把代 ...

  7. 无快不破,在本地 docker 运行 IDEA 里面的项目?

    目录 前言 Docker Compose 1. Docker Compose是什么? 2. Docker Compose 的具体步骤 3. 如何在IDEA项目里面使用Docker Compose 启动 ...

  8. spring 使用 事件机制

    概述 在编写代码的时候,比如我删除一篇文章,这个时候,如果我想做些额外的逻辑,这是就需要修改删除部分的代码.spring 提供了事件机制更优雅的实现这个,用户只需要实现事件监听即可. 代码实现 注入发 ...

  9. 斐波那契数列(Java实现)

    斐波那契数列 题目描述: 悲波那契数列(Fibonacci sequence)又称黄金分割数列,因数学家莱昂纳多·裴波那契(LeonardodaFibonacci)以兔子繁殖为例子而引入,故又称为&q ...

  10. Prometheus 3.0.0 升级中遇到的 `--storage.tsdb.retention` 错误的修复方法

    在将 Prometheus 升级到 3.0.0 后,许多用户会遇到以下错误: Error parsing command line arguments: unknown long flag '--st ...