首页 > 编程语言 >Peewee:Python 简洁强大的 ORM 框架

Peewee:Python 简洁强大的 ORM 框架

时间:2025-01-15 22:53:59浏览次数:1  
标签:username Python Peewee age ORM User 数据库 user

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

标签:username,Python,Peewee,age,ORM,User,数据库,user
From: https://www.cnblogs.com/wang_yb/p/18673860

相关文章

  • sqoop export报错Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
    sqoopexport报错Timestampformatmustbeyyyy-mm-ddhh:mm:ss[.fffffffff]sqoopexport报错如下:Causedby:java.lang.IllegalArgumentException:Timestampformatmustbeyyyy-mm-ddhh:mm:ss[.fffffffff]atjava.sql.Timestamp.valueOf(Timestamp.java:204)atGS......
  • 【Niquests】最简单和先进的Python HTTP 客户端,完美替换Requests
    什么是NiquestsNiquests是一个简单而优雅的HTTP客户端,简单说它是Requests的直接替代品。因为多年来Requests功能一直处于停滞不前的状态,由于不前进的状态并且没有发展,这阻止了数百万开发人员使用更高级的功能,所以就有了Niquests,Niquests是唯一能够自动提供HTTP/1.1......
  • Windows python venv 虚拟开发环境
    前言全局说明Windowspythonvenv虚拟开发环境一、说明1.1环境:Windows11家庭版23H222631.3737Python3.8.10(tags/v3.8.10:3d8993a,May32021,11:48:03)[MSCv.192864bit(AMD64)]onwin32二、venv2.1创建项目目录mkdirxhs-monitorcdxhs-monito......
  • Windows pyenv管理多python 版本环境安装
    前言全局说明Windowspython多版本安装,因为开发功能和客户要求,py脚本会被要求不同版本,但是命令行输入时同一个名字只能对应一个版本,如果多个版本,那只能改名字。比如:python3.8python3.9有什么方法用一个python使用不同版本呢?一、说明1.1环境:Windows11家庭版23H2......
  • Python----Python高级(面向对象:对象,类,属性,方法)
    一、面向对象简介Python完全采用了面向对象的思想,是真正面向对象的编程语言,完全支持面向对象的基本功能,例如:继承、多态、封装等。Python中,一切皆对象。python数据类型、函数等,都是对象。面向对象(ObjectorientedProgramming,OOP)编程的思想主要是针对大型软件设计而来的......
  • Python中LLM的模型动态深度调整:早退机制
    文章目录引言早退机制的基本原理1.1早退机制的工作流程1.2退出分数的计算1.3早退机制的优点早退机制的实现2.1模型结构设计2.2早退模块的设计2.3早退决策的实现2.4训练与推理早退机制的应用场景3.1实时推理3.2边缘计算3.3自适应模型早退机制的优化与挑战4.1......
  • 13.Python3 类型注解
    Python3类型注解Python类型注解(TypeHints)是自Python3.5引入的一种特性,它允许开发者在定义函数、变量时指定数据类型。类型注解并非强制执行的,它们主要用于提高代码的可读性和可维护性,并支持静态分析工具进行类型检查。类型注解不会影响Python的动态特性,也不会在运行时被......
  • python批量
    python第一步def一个txt,按时间戳拆分内容以查找单独的部分,时间戳的格式为YYYY-MM-DDHH:MM:SS,因此我们将使用正则表达式根据此模式进行拆分,拆分后处理32×32列的数组,删除前2列和后9列。第二步dif处理指定目录中的所有.txt文件,并按第一步的方法处理所有txtx文件。将所得的多个txt......
  • Python Playwright学习笔记(一)
    一、简介1.1Playwright是什么?它是微软在2020年初开源的新一代自动化测试工具,其功能和selenium类似,都可以驱动浏览器进行各种自动化操作。1.2、特点是什么支持当前所有的主流浏览器,包括chrome、edge、firefox、safari;支持跨平台多语言:支持Windows、Linux、macOS;安装和......
  • python 按时间戳删除32×32数组的前2列和后9列
    还是雨滴谱文件,这次尝试批量处理首先处理1个单独的txt文件#!usr/bin/envpython#-*-coding:utf-8_*-"""@author:Suyue@file:raindrop.py@time:2025/01/15{DAY}@desc:"""importnumpyasnpimportredefprocess_file(input_file,output_file):......