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, *_, **__): pass


class BaseModel(Model):
    class Meta:
        database = database


class 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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hdoop学习笔记(HDP)-Part.7 安装MySQL

七、安装MySQL mysql主从复制的原理&#xff1a; 1&#xff09;master将数据改变记录到二进制日志&#xff08;binary log&#xff09;中&#xff0c;也即是配置文件log-bin指定的文件&#xff08;这些记录叫做二进制日志事件&#xff0c;binary log events&#xff09;&#…

(六)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…

Windows环境 dockertopdesk 部署gitlab

1.在dockertopdesk里搜索 gitlab镜像 (pull)拉取镜像 2.运行镜像到容器 mkdir gitlab gitlab/etc gitlab/log gitlab/opt docker run -id -p 3000:80 -p 9922:22 -v /root/gitlab/etc:/etc/gitlab -v /root/gitlab/log:/var/log/gitlab -v /root/gitlab/opt:/var/opt/gitla…

IntelliJ IDEA 之初体验(上)

IntelliJ IDEA 是一款由 JetBrains 公司开发的强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专注于 Java 开发&#xff0c;同时支持多种其他编程语言。本文将详细介绍 IntelliJ IDEA 的安装过程以及一些常用的基本操作。 第一步&#xff1a;下载与安装 IntelliJ…

【LeetCode每日一题合集】2023.11.20-2023.11.26 (二叉树中的伪回文路径)

文章目录 53. 最大子数组和解法1——DP解法2——分治&#xff08;维护区间、类似线段树的思想&#xff09; 2216. 美化数组的最少删除数&#xff08;贪心&#xff09;2304. 网格中的最小路径代价1410. HTML 实体解析器&#xff08;模拟&#xff09;2824. 统计和小于目标的下标对…

k8s ingress 无法找到端点

文章目录 ingress rule无法找到端点这个注解是什么意思呢&#xff1f;为何不生效呢&#xff1f;端点无法更新&#xff1f;如何确认ingressclass呢&#xff1f;修复端点无法发现的问题多个ingress controller 架构 ingress rule无法找到端点 在vnnox-cn集群创建ingress&#xf…

IntelliJ IDEA创建springboot项目时不能选择java8的问题解决方案

最近博主也有创建springboot项目&#xff0c;发现了IntelliJ IDEA在通过Spring Initilizer初始化项目的时候已经没有java8版本的选项了。 基于这个问题&#xff0c;有了这篇文章的分享&#xff0c;希望能够帮助大家克服这个困难。 如图&#xff0c;现在创建springboot项目的时…

win10 修改任务栏颜色 “开始菜单、任务栏和操作中心” 是灰色无法点击,一共就两步,彻底解决有图有真相。

电脑恢复了一下出厂设置、然后任务栏修改要修改一下颜色&#xff0c;之前会后来忘记了&#xff0c;擦。 查了半天文档没用&#xff0c;最后找到官网才算是看到问题解决办法。 问题现象: 解决办法: 往上滑、找到这里 浅色改成深色、然后就可以了&#xff0c;就这么简单。 w…

Drift plus penalty 漂移加惩罚Part2——性能分析

文章目录 正文Performance analysisAverage penalty analysis 平均惩罚分析Average queue size analysis 平均队列大小分析Probability 1 convergenceApplication to queues with finite capacityTreatment of queueing systemsConvex functions of time averages Delay tradeo…

服务器数据恢复—服务器断电导致XenServer数据文件丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌720服务器搭配该品牌某型号RAID卡&#xff0c;使用4块STAT硬盘组建了一组RAID10阵列。服务器上部署XenServer虚拟化平台&#xff0c;系统盘 数据盘两个虚拟机磁盘。虚拟机上安装的是Windows Server操作系统&#xff0c;作为Web服务器使用…

【算法刷题】Day9

文章目录 611. 有效三角形的个数题干&#xff1a;题解&#xff1a;代码&#xff1a; LCR 179. 查找总价格为目标值的两个商品题干&#xff1a;题解&#xff1a;代码&#xff1a; 1137. 第 N 个泰波那契数题干&#xff1a;原理&#xff1a;1、状态表示&#xff08;dp表里面的值所…

如何让Win11的右键菜单恢复到Win10的样式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言如何让Win11的右键菜单恢复到Win10的样式1. winr打开运行&#xff0c;输入cmd后回车2.输入命令并回车3.重启计算机 前言 提示&#xff1a;这里可以添加本文要记…

敌方坦克发射思路[java坦克大战]

1.在敌人坦克类&#xff0c;创建Vector用于保存Shot对象 2.当每创建一个敌人坦克对象&#xff0c;就给该敌人坦克对象初始化一个Shot对象&#xff08;注意子弹初始位置以及必须在设置完敌人坦克初始方向&#xff09;&#xff0c;将该对象加入Vector后&#xff0c;立即启动shot发…

熬夜会秃头——beta冲刺Day7

这个作业属于哪个课程2301-计算机学院-软件工程社区-CSDN社区云这个作业要求在哪里团队作业—beta冲刺事后诸葛亮-CSDN社区这个作业的目标记录beta冲刺Day7团队名称熬夜会秃头团队置顶集合随笔链接熬夜会秃头——Beta冲刺置顶随笔-CSDN社区 一、团队成员会议总结 1、成员工作…

时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)

时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标) 目录 时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)预测效果基本介绍环境准备程序设计参考资料预测效果 基本介绍

专注数据采集分析系统研发 做设备与MES系统中转站

数据采集是实现MES系统与设备对接的核心环节。通过采集设备产生的实时数据&#xff0c;将其传输给MES系统进行处理和分析。数据采集可以通过直接连接设备的传感器或者通过设备上安装的采集设备实现。采集的数据可以包括设备的运行状态、产量数据、测量数据、能耗数据等。通过数…

c语言-快速排序

目录 一、实现快速排序三种方法 1、hoare法 2、挖坑法 3、双指针法 4、快速排序的优化 5、测试对比 结语&#xff1a; 前言&#xff1a; 快速排序作为多种排序方法中效率最高的一种&#xff0c;其底层原理被广泛运用&#xff0c;他的核心思想与二叉树结构中的递归逻辑相似…

在re:Invent上IBM宣布与亚马逊云科技携手,Amazon RDS for DB2正式亮相

11月29日&#xff0c;IBM在亚马逊云科技re:Invent 2023上宣布&#xff0c;与亚马逊云科技合作推出Amazon Relational Database Service&#xff08;Amazon RDS&#xff09;for Db2。这项全新的完全托管云服务旨在简化客户在混合云环境中管理人工智能&#xff08;AI&#xff09;…

element中el-table表头通过header-row-style设置样式

文章目录 一、知识点二、设置全部表头2.1、方式一2.2、方式二 三、设置某个表头四、最后 一、知识点 有些时候需要给element-ui表头设置不同样式&#xff0c;比如居中、背景色、字体大小等等&#xff0c;这时就可以用到本文要说的属性header-row-style。官网说明如下所示&…

C++作业4

代码整理&#xff0c; 将学过的三种运算符重载&#xff0c;每个至少实现一个运算符的重载 代码&#xff1a; #include <iostream>using namespace std;class Stu {friend const Stu operator*(const Stu &L,const Stu &R);friend bool operator<(const Stu …