Python 进阶(二):Python使用ORM框架peewee操作MySQL数据库

news2024/10/7 10:22:30

Python使用ORM框架peewee操作数据库

  • 前言
  • 1. 安装Peewee库并初始化数据库
  • 2. 创建数据库连接
  • 3. 定义数据表模型类
  • 4. 连接数据库并创建表
  • 5. 操作数据库
    • 5.1 插入数据
    • 5.2 查询数据
    • 5.3 更新数据
    • 5.4 删除数据
  • 6. 聚合查询

前言

本文基于MySQL8.x版本的学习,python版本基于当前最新的3.x,windows操作系统下mysql的安装流程,可参考我之前的文章:
Windows MySQL8.0免安装版,配置多个安装实例

Peewee是一个简单而灵活的Python ORM(对象关系映射)框架,它提供了方便的接口和工具,用于在Python应用程序中进行数据库操作。Peewee支持多种数据库后端,包括MySQL、SQLite、PostgreSQL等,使得在不同数据库系统之间进行切换变得更加容易。

1. 安装Peewee库并初始化数据库

  • 1.1 首先安装Peewee库,在terminal中输入命令:

    pip install peewee
    

    在这里插入图片描述

  • 1.2 执行mysql脚本,创建mysql数据库和创建数据表

    安装好mysql数据库后,执行创建数据库命令

    CREATE DATABASE `py_conn_test` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';
    

    执行创建数据表操作

    # 书目表
    CREATE TABLE `py_conn_test`.`book`  (
      `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
      `title` varchar(255) NULL COMMENT '书名',
      `author` varchar(255) NULL COMMENT '作者',
      `price` float(10, 2) NULL COMMENT '书名价格',
      `edition` int NULL COMMENT '版次',
      PRIMARY KEY (`id`)
    );
    

2. 创建数据库连接

在使用Peewee进行数据库操作之前创建一个数据库连接。输入连接参数:数据库名称、用户名、密码、主机和端口

from peewee import *

# 创建MySQL数据库连接
db = MySQLDatabase('py_conn_test', user='zhouquan', password='zhouquan@123',host='localhost', port=4706)

更好地组织代码,并使代码更易于维护和扩展。我们将数据库连接和映射类集中在一个地方,并在需要的时候导入并使用

新建database.py文件,数据库连接的代码写入此文件
在这里插入图片描述

3. 定义数据表模型类

使用Peewee进行数据库操作,需要定义数据表的模型类。每个模型类对应数据库中的一张表,并定义表中的字段以及其他相关属性。

class Book(Model):
    id = AutoField(primary_key=True)
    title = CharField()
    author = CharField()
    price = FloatField()
    edition = IntegerField()

    class Meta:
        database = db

在上述示例中,定义了一个名为User的模型类,它继承自Peewee的Model类。title author price edition是该数据表的字段。在Meta类中,指定了该模型类使用的数据库连接。

将映射类写入新建的database.py文件
在这里插入图片描述

4. 连接数据库并创建表

注意:这里仅做示例,在开发中数据表应该是创建好的!因此可以不执行此模块代码示例
在开始使用模型类进行数据库操作之前,需要先连接数据库并创建相关的表。

# 连接数据库
db.connect()

# 创建表
db.create_tables([Book])

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

5. 操作数据库

5.1 插入数据

使用Peewee插入数据非常简单,只需创建模型类的实例,并设置相应的属性值,然后调用save()方法保存到数据库中。

# 引入数据库连接模块和Book映射类
from database import db, Book

# 连接数据库
db.connect()

# 插入数据
book = Book(title="三体一", author="刘慈欣", price=59.5, edition=6)
book.save()

book = Book(title="1984", author="乔治奥威尔", price=47.9, edition=2)
book.save()

book = Book(title="万历十五年", author="黄仁宇", price=125.5, edition=3)
book.save()

在这里插入图片描述

5.2 查询数据

Peewee提供了丰富的查询API,可以灵活地进行条件查询、排序、限制返回结果等操作。

# 引入数据库连接模块和Book映射类
from database import db, Book

# 连接数据库
db.connect()

books = Book.select()
for book in books:
    print("全部查询:", book.to_string())

print("--------------------------------------------")

books = Book.select().where(Book.price < 100)
for book in books:
    print("价格小于100:", book.to_string())

print("--------------------------------------------")

# 排序查询
books = Book.select().order_by(Book.price.asc())
for book in books:
    print("价格升序排序:", book.to_string())

print("--------------------------------------------")

# 限制返回结果数量
books = Book.select().limit(2)
for book in books:
    print("限制返回两条结果:", book.to_string())

查询结果如下:

全部查询: id=5,title=三体一,author=刘慈欣,price=59.5,edition=6
全部查询: id=6,title=1984,author=乔治奥威尔,price=47.9,edition=2
全部查询: id=7,title=万历十五年,author=黄仁宇,price=125.5,edition=3
--------------------------------------------
价格小于100: id=5,title=三体一,author=刘慈欣,price=59.5,edition=6
价格小于100: id=6,title=1984,author=乔治奥威尔,price=47.9,edition=2
--------------------------------------------
价格升序排序: id=6,title=1984,author=乔治奥威尔,price=47.9,edition=2
价格升序排序: id=5,title=三体一,author=刘慈欣,price=59.5,edition=6
价格升序排序: id=7,title=万历十五年,author=黄仁宇,price=125.5,edition=3
--------------------------------------------
限制返回两条结果: id=5,title=三体一,author=刘慈欣,price=59.5,edition=6
限制返回两条结果: id=6,title=1984,author=乔治奥威尔,price=47.9,edition=2

5.3 更新数据

使用Peewee更新数据也非常简单,可以直接修改模型实例的属性,并调用save()方法保存修改后的数据到数据库中。

# 引入数据库连接模块和Book映射类
from database import db, Book

# 连接数据库
db.connect()

book = Book.get_by_id(5)
print("修改前:", book.to_string())

book.price = 24.5
book.save()
print("修改后:", book.to_string())

在这里插入图片描述

5.4 删除数据

使用Peewee删除数据可以通过调用模型实例

delete_instance()方法或使用delete()方法进行删除操作。

# 引入数据库连接模块和Book映射类
from database import db, Book

# 连接数据库
db.connect()

print("删除前数据:")
books = Book.select()
for book in books:
    print(book.to_string())

book = Book.get(Book.title == '1984')
book.delete_instance()

# 使用where条件删除数据
Book.delete().where(Book.edition == 3).execute()

print("删除后数据:")
books = Book.select()
for book in books:
    print(book.to_string())

在这里插入图片描述

6. 聚合查询

# 引入数据库连接模块和Book映射类
from peewee import fn

from database import db, Book

# 连接数据库
db.connect()

'''
# 清空book表
delete from book;

# 执行聚合前先进行mysql的插入,插入数据用于聚合
INSERT INTO `py_conn_test`.`book`( `title`, `author`, `price`, `edition`) VALUES ( '三体二', '刘慈欣', 24.5, 6);
INSERT INTO `py_conn_test`.`book`( `title`, `author`, `price`, `edition`) VALUES ( '三体三', '刘慈欣', 24.5, 6);
INSERT INTO `py_conn_test`.`book`( `title`, `author`, `price`, `edition`) VALUES ( '1984', '乔治奥威尔', 47.9, 2);
INSERT INTO `py_conn_test`.`book`( `title`, `author`, `price`, `edition`) VALUES ( '动物农场', '乔治奥威尔', 47.9, 2);
INSERT INTO `py_conn_test`.`book`( `title`, `author`, `price`, `edition`) VALUES ( '伊豆舞女', '川端康成', 47.9, 2);
'''

# 聚合出数据库中书目大于等于2的作者信息
group_query = (Book
               .select(Book.author, fn.Count(Book.id).alias('count'))
               .group_by(Book.author)
               .having(fn.Count(Book.id) >= 2))

print("查询SQL打印:", group_query)

# 打印聚合结果
for book in group_query:
    print(f"标题: {book.author}, 计数: {book.count}")

查询结果:

查询SQL打印: SELECT `t1`.`author`, Count(`t1`.`id`) AS `count` FROM `book` AS `t1` GROUP BY `t1`.`author` HAVING (Count(`t1`.`id`) >= 2)
标题: 刘慈欣, 计数: 2
标题: 乔治奥威尔, 计数: 2

示例中展示了一些Peewee的基本用法和常见操作,但Peewee还有更多的功能和选项可供探索,例如事务管理、连接池、复杂查询等。可以参考Peewee的官方文档(http://docs.peewee-orm.com/)以了解更多详细信息和示例。

以上为使用Peewee对mysql的基础的应用,至于复杂的语句查询如果有人需要或者看的话再写吧

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美客多、Newegg卖家如何提高店铺销量?测评自养号的重要性

作为美客多和Newegg平台上的卖家&#xff0c;提高店铺销量是卖家取得商业成功的关键。珑哥今天来说一些有效的策略&#xff0c;帮助卖家增加销售额并提升店铺的知名度和竞争力。 优化产品页面&#xff1a; 优秀的产品页面可以吸引更多买家并促进销售。确保产品标题准确、吸引人…

经典文献阅读之--NICE-SLAM(SLAM的神经隐含可扩展编码)

0. 简介 对于深度学习而言&#xff0c;NeRF一定是最近两年最火的工作之一了&#xff0c;**NeRF&#xff08;Neural Radiance Fields&#xff09;**是最早在2020年ECCV会议上的Best Paper&#xff0c;其将隐式表达推上了一个新的高度&#xff0c;仅用 2D 的 posed images 作为监…

stm32配置基本定时功能

Clock Source参数说明 内部时钟源是由STM32F103芯片内部的RC振荡器提供的。它的频率为8MHz&#xff0c;可以通过PLL倍频器进行倍频&#xff0c;最高可达到72MHz。 Internal clock Division No Division&#xff1a;不分频&#xff0c;即系统时钟直接作为时钟信号。Divided by 2…

ModaHub AI模型社区:向量数据库CPU 版 Milvus和GPU 版 Milvus 版本比较

目录 CPU 版 Milvus 版本比较 概述 CPU 版 Milvus 支持的索引类型 浮点型向量 二值型向量 GPU 版 Milvus 版本比较 概述 GPU 版 Milvus 支持的索引类型 浮点型向量 二值型向量 CPU 版 Milvus 版本比较 概述 Milvus 提供两个发行版本&#xff1a;CPU 版本和 GPU 版本…

学生成绩管理系统(Python+数据库)

文章目录 前言MySQL部分1. 导入信息2. 演示说明 Python程序设计部分1. 连接数据库2. 登录界面3. 注册界面4. 主界面5. 查询信息6. 修改密码7. 成绩分析7.1 通过学号查询成绩7.2 通过课程号查询成绩 7. 主函数 尾声 前言 用Python和数据库一起实现了一个简单的学生成绩管理系统…

GPDB-内核特性-UDP流量控制

GPDB-内核特性-UDP流量控制 GPDB是在开源PostgreSQL基础上&#xff0c;采用MPP架构的关系型分布式数据库&#xff0c;具有强大的大规模数据分析任务处理能力。采用Shared-Nothing架构&#xff0c;整个集群由多个数据节点&#xff08;segment&#xff09;和控制节点&#xff08;…

Python爬虫 从小白到高手 各种最新案例! Urllib Xpath

Urllib 1.什么是互联网爬虫&#xff1f; 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物&#xff0c;而爬虫程序就是一只小蜘蛛&#xff0c;沿着蜘蛛网抓取自己想要的数据 解释1&#xff1a;通过一个程序&#xff0c;根据Url(http…

实训五:数据库安全控制 - 创建用户

创建用户 第1关&#xff1a;创建用户任务描述相关知识增加用户修改用户名修改用户密码删除用户 编程要求测试说明参考代码 第2关&#xff1a;创建用户-练习任务描述相关知识编程要求测试说明参考代码 第1关&#xff1a;创建用户 任务描述 本关任务&#xff1a;创建用户 user1…

你不知道的HTML属性,让你的网页更加响应式

前言 当我们谈论 HTML 时&#xff0c;通常会想到一些常见的属性&#xff0c;如 class、id、href 等等。但是&#xff0c;HTML 还有许多你可能从未听说过的属性&#xff0c;这些属性可以让你的网页更加丰富多彩。在本文中&#xff0c;我将介绍一些你可能不知道的 HTML 属性&…

SPI通信协议SPI通信外设

目录 SPI 介绍 硬件电路 移位示意图 软件SPI SPI时序基本单元 SPI时序​编辑 W25Q64 硬件电路 W25Q64框图 Flash操作注意事项 指令集 硬件SPI SPI框图 主模式全双工连续传输 非连续传输 SPI 介绍 硬件电路 推挽输出&#xff0c;高低电平都有很强的驱动能力&…

基于Python数据分析的详细讲解+实战(含代码)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 载入数据集 数据预处理 探索性数据分析 发现相关性 开发模型 模型部署 Python数据分析代码实…

Vue基础(一)

前言&#xff1a; Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。 …

【Vue2.0源码学习】内置组件篇-keep-alive

文章目录 1. 前言2 用法回顾3. 实现原理propscreateddestroyedmountedrender 4. 生命周期钩子5. 总结 1. 前言 <keep-alive> 是 Vue 实现的一个内置组件&#xff0c;也就是说 Vue 源码不仅实现了一套组件化的机制&#xff0c;也实现了一些内置组件&#xff0c;关于<k…

区块链系统探索之路:比特币核心的编译和探索

前几节我们研究了椭圆曲线&#xff0c;有限域等比特币和区块链所依赖的底层算法。问题在于这些算法不是独立存在&#xff0c;而是作为模块嵌入到整个区块链的体系之中。因此不了解区块链的体系组成或应用场景&#xff0c;那么我们就很难理解这些算法衍生出来的概念或者基于他们…

【硬件1】platform/i2c总线

文章目录 1.platform总线&#xff1a;相对于USB/PCI/I2C/SPI等物理总线来说&#xff0c;platform总线是一种虚拟的总线&#xff0c;实际并不存在&#xff0c;总线的工作就是就是完成总线下的设备和驱动之间的匹配。也就是在左手中找到与右手相匹配的设备驱动&#xff0c;并完成…

基于Java+Springboot的智能图书馆座位管理系统设计和实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

MySQL实战解析底层---为什么只查一行的语句,也执行这么慢

目录 前言 第一类&#xff1a;查询长时间不返回 第二类&#xff1a;查询慢 前言 一般情况下&#xff0c;如果说查询性能优化&#xff0c;首先会想到一些复杂的语句&#xff0c;想到查询需要返回大量的数据但有些情况下&#xff0c;“查一行”&#xff0c;也会执行得特别慢这…

第11讲:BootService 核心实现解析,Agent 的“地基”原来是这样的

之前介绍了 ServiceManager 加载并初始化 BootService 实现的核心逻辑。下图展示了 BootService 接口的所有实现类&#xff0c;本课时将深入分析这些 BootService 实现类的具体逻辑&#xff1a; 网络连接管理 在前面的介绍中提到 SkyWalking Agent 会定期将收集到的 JVM 监控和…

基于Java+Swing实现雷电小游戏

基于JavaSwing实现雷电小游戏 一、系统介绍二、功能展示三、其他系统四、获取源码 一、系统介绍 基于java的雷电游戏基本功能包括&#xff1a;敌方飞机随机飞行、我方飞机手动控制飞行&#xff0c;射击比拼&#xff0c;游戏闯关等。本系统结构如下&#xff1a; &#xff08;1&…

Java中线程的创建与使用、Thread类的常用方法

1、什么是进程与线程 1.1 含义 1.1.1 进程 进程是指正在运行的程序的实例。在操作系统中&#xff0c;一个进程代表了一个正在执行的程序&#xff0c;它包括了程序的代码、数据以及程序执行时所需要的系统资源。 最直观的就是我们任务管理器&#xff1a; 任务管理器中的每一…