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

admin / 文章 / ... / Reads: 259

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

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

pip install peewee

peewee 安装 MySQL 驱动

如果你想使用PyMySQL,你需要在安装peewee之后,显式告诉peewee使用PyMySQL作为数据库驱动:

pip install pymysql

执行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`)  
);

创建数据库连接

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

from peewee import *

创建MySQL数据库连接

db = MySQLDatabase('py_conn_test', user='zhouquan', password='zhouquan@123',host='localhost', port=4706)

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

新建database.py文件,数据库连接的代码写入此文件

微信图片_20240712095900

定义数据表模型类

使用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文件

微信截图_20240712101331

连接数据库并创建表

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

# 连接数据库
db.connect()

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

操作数据库

插入数据

使用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()

查询数据

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

更新数据

使用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())

删除数据

使用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())
    

聚合查询

# 引入数据库连接模块和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}")

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

资料参考

https://blog.csdn.net/qq_29864051/article/details/131359489

https://zhuanlan.zhihu.com/p/687417243

Comments

Make a comment

Author: admin

Publish at: ...

关于作者

王硕,网名信平,十多年软件开发经验,架构师,熟悉 Java/Python/Go 等,喜欢研究技术,读书,音乐和宅在家里。
专注于研究互联网产品和技术,提供中文精品教程。 本网站与其它任何公司及/或商标无任何形式关联或合作。
Email: xujieiata@163.com

www.ultrapower.com ,王硕的博客,专注于研究互联网产品和技术,提供中文精品教程。 本网站与其它任何公司及/或商标无任何形式关联或合作。