Python | 轻量ORM框架Peewee的基础使用(增删改查、自动创建模型类、事务装饰器)

本文主要是介绍Python | 轻量ORM框架Peewee的基础使用(增删改查、自动创建模型类、事务装饰器),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 01 简介
  • 02 安装
  • 03 自动创建模型类
  • 04 基础使用
    • 4.1 查询
    • 4.2 新增
    • 4.3 更新
    • 4.4 删除
  • 05 事务


01 简介

在使用python开发的过程中,有时需要一些简单的数据库操作,而Peewee正是理想的选择,它是一个小巧而灵活的 Python ORM(对象关系映射)框架,用于简化数据库操作。

本文基于mysql数据库,介绍最基础和常用的用法。

官方文档:
https://docs.peewee-orm.com/en/latest/index.html

GitHub上目前已有10.5k Star:
https://github.com/coleifer/peewee

02 安装

# 安装peewee库
pip install peewee
# 安装mysql数据库客户端
pip install pymysql

03 自动创建模型类

假设我有一个名为test的数据库,其中有一张名为user的表,此时可以通过命令自动创建该数据库下各个表的映射模型类:

python -m pwiz -e <db_type> -H <host> -p <port> -u <username> -P <db_name> > model.py

其中:

  • db_type:数据库类型,例如mysql
  • host:数据库主机地址
  • port:端口
  • username:数据库连接的用户名
  • db_name:数据库名称

示例:

python -m pwiz -e mysql -H 192.168.0.25 -p 3306 -u root -P test > model.py

执行后,会让输入数据库连接密码,而后会在cmd启动的所在目录下生成一个model.py文件。

注意:刚生成的model.py文件编码可能与系统不同,例如我显示是UTF-16LE编码,需要转换为与项目其他.py文件相同的编码。

在这里插入图片描述
在这里插入图片描述

创建好的模型类:

from peewee import *database = MySQLDatabase('test', **{'charset': 'utf8', 'sql_mode': 'PIPES_AS_CONCAT', 'use_unicode': True,'host': '...', 'port': 3306, 'user': 'root', 'password': '...'})class UnknownField(object):def __init__(self, *_, **__): passclass BaseModel(Model):class Meta:database = databaseclass User(BaseModel):age = IntegerField(null=True)email = CharField(null=True)name = CharField()class Meta:table_name = 'user'

这里面的User类对应的就是我数据库中的user表,模型类虽然不显式包含主键字段,但使用user.id可以查看得到。

  • 操作结束后建议关闭连接:
database.close()

04 基础使用

4.1 查询

  • 查询所有用户
# 查询所有用户
users = User.select()# 看看有多少条数据
print(len(users))# 查看第0条数据
print(users[0])# 查看所有数据
for user in users:print(user)  # 每个user都是User模型对象 这里print会输出主键值print(user, user.name, user.age, user.email)
  • 查询特定属性
users = User.select(User.name, User.age)
for user in users:print(user.name, user.age)
  • 条件查询
# 使用where实现条件查询
young_users: ModelSelect = User.select().where(User.age < 35)
for user in young_users:print(user, user.name, user.age, user.email)
  • 查询单个用户
# 使用get 直接返回一个User对象
user = User.get(User.name == '张三')
print(user.name, user.name)
  • 根据主键查询
# get_by_id()方法
user = User.get_by_id(3)
print(user.name)
  • 多条件、排序、LIMIT
SELECT name FROM `user` WHERE name = '张三' AND email = 'xxx@qq.com' ORDER BY age DESC LIMIT 5;

转换为:

query = User.select(User.name).where((User.name == '张三') & (User.email == 'xxx@qq.com')).order_by(User.age.desc()).limit(20)
  • 子查询示例
SELECT * FROM `user` WHERE id NOT IN (SELECT id FROM user_new);

转换:

inner_query = User.select(User.id);
query = User.select().where(User.id.not_in(inner_query))

4.2 新增

# 会在数据库新增数据 同时也会返回这个新对象
user = User.create(name="王五", age=28, email=None)
print(user.name)

4.3 更新

# 注意最后要加execute()
User.update(email='xxx@qq.com').where(User.name == '王五').execute()

4.4 删除

# 条件删除
User.delete().where(User.name == '张三').execute()# 按照id删除 不需要execute()
User.delete_by_id(2)

更新和删除操作,往往要在最后加execute()

05 事务

使用atomic装饰器实现原子操作:

# 创建数据库连接
database = MySQLDatabase(...)# 在方法上使用装饰器来保证原子操作 注意这里的()符号不能省略
@database.atomic()
def func():User.update(age=20).where(User.name == "张三").execute()User.update(age=21).where(User.name == "李四").execute()# 结束后关闭连接
database.close()

这篇关于Python | 轻量ORM框架Peewee的基础使用(增删改查、自动创建模型类、事务装饰器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个