>>> from env_helper import info; info()
页面更新时间: 2024-04-07 15:58:15
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

2.4. 使用 Peewee 模块进行数据库的CRUD

“Peewee是一个简单而小型的ORM。它几乎没有(但富有表现力)概念,使其易于学习且使用直观”.这是官网的自我介绍,那么什么是“ORM”呢?

ORM:对象关系映射(Object Relational Mapping)是通过使用描述对象和数据库之间映射的元数据, 将面向对象语言程序中的对象自动持久化到关系数据库中。 本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销; 然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理; 但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。

2.4.1. 安装与测试

可用 pip3 install peewee 方式安装peewee库。

>>> from peewee import *

在 Debian / Ubuntu 中通过命令安装:

sudo apt install python3-peewee

Peewee附带了几个C扩展名的源文件 ,如果可用Cython的话,它们也会被构建。

Sqlite扩展,包括SQLite日期操作功能的Cython实现,REGEXP运算符和全文搜索结果排名算法。这些扩展为SQLite数据库用户提供了附加功能并提高了性能。Peewee将尝试提前确定是否已安装SQLite3,并且仅当系统上有SQLite共享库时才构建SQLite扩展。

2.4.2. 创建数据库与表

>>> db = SqliteDatabase('xx_people.db')
>>> class Person(Model):
>>>     name = CharField()
>>>     birthday = DateField()
>>>     class Meta:
>>>         database = db

现在我们有了模型,让我们连接到数据库。

>>> db.connect()
True

创建表,命名为Person。

>>> db.create_tables([Person,])

2.4.3. 插入信息

插入的时候,如果字段设置了default值,则会按照default指定的值插入。 如果没有指定,同时字段可以为 null ,则数据库自动初始化值为 null ; 如果字段不能为 null ,则数据库自动初始化为其零值。

如果字段为非Null,最好设置default值, 同时数据库 schema也设置其default值,如果字段为可以为 null ,那么缺省值就设置为 null 即可。

>>> from datetime import date
>>> uncle_bob = Person(name='Bob', birthday=date(1960, 1, 15))
>>> uncle_bob.save()
1

也可以通过调用create()方法来添加数据信息,该方法返回模型实例:

>>> grandma = Person.create(name='Grandma', birthday=date(1935, 3, 1))
>>> herb = Person.create(name='Herb', birthday=date(1950, 5, 5))

2.4.4. 检索数据

数据库的真正优势在于它如何使我们能够通过查询检索数据。

>>> p = Person.select().where(Person.name == 'Bob').get()
>>> print(p)
4
>>> for person in Person.select():
>>>     print(person.name)
Grandma
Herb
Bob
Grandma
Herb

2.4.5. 修改数据

使用update()来更新数据,一般都会搭配where()使用.

>>> bob = Person.update({Person.name: 'Bobbbb'}).where(Person.name == 'Bob')
>>> bob.execute()
1
>>> for person in Person.select():
>>>     print(person.name)
Grandma
Herb
Bobbbb
Grandma
Herb

在这个基础上再添加一个字段。

>>> bob = Person(name='Bobbbb',  is_relative=False)
>>> bob.id = 1
>>> bob.save()
0

2.4.6. 删除数据

使用delete().where().execute()进行删除,where()是条件,execute()负责执行语句。若是已经查询出来的实例,则直接使用delete_instance()删除。

>>> bob.delete_instance()
0
>>> for person in Person.select():
>>>     print(person.name)
Grandma
Herb
Bobbbb
Grandma
Herb

delete_instance() 返回值是从数据库中删除的行数。