您的位置:

Python Peewee 库

Peewee 是一个基于 ORM(对象-关系映射)的 Python 库,支持 SQLite、MySQL、PostgreSQL 和蟑螂数据库。在下面的教程中,我们将学习如何使用 Python 编程语言中的 Peewee 库插入新记录、删除记录、创建索引等等。此外,我们还将了解关于 Peewee 的连接管理、文本和二进制字段、子查询、过滤器等等。

那么,让我们开始吧。

理解 Python 中的 Peewee 库

  1. Peewee 是美国软件工程师 Charles Leifer 于 2010 年 10 月开发的 Python 对象关系映射(也称为 ORM)库。
  2. 这个库的最新版本是 3.14.8。这个库支持 SQLite、MySQL、PostgreSQL 和蟑螂的数据库。
  3. 对象关系映射是一种编程方法,允许程序员在面向对象编程语言的不兼容类型系统之间转换数据。
  4. 类被认为是非标量的,因为它们是在面向对象编程语言(OOPs)中定义的,比如 Python。它不能表示为像整数和字符串这样的原始数据类型。
  5. 相比之下,SQLite、MySQL、Oracle 等数据库只能存储和操作表中排列的整数和字符串等标量值。
  6. 程序员应该或者将对象的值转换成标量数据类型的集合以存储在数据库中,或者在检索时将它们转换回来,或者只在程序中使用简单的标量值。
  7. 在 ORM 系统中,每个类都映射到底层数据库中的一个表。作为我们自己编写繁琐的数据库接口代码的替代,ORM 解决了这些问题,同时我们可以专注于系统逻辑的编程。

设置环境

我们可以使用如下所示的 pip 安装程序安装最新版本的 Peewee,该版本托管在PyPI(Python 包索引的缩写)上:

语法:


$ pip3 install Peewee

此库没有其他依赖项。由于 sqlite3 模块与标准库捆绑在一起,因此它可以在不安装任何其他软件包的情况下与 SQLite 一起工作。

但是,为了使用 MySQL 和 PostgreSQL,我们可能必须分别安装与 DB-API 兼容的驱动程序模块——pymysql 和 pyscopg2。蟑螂数据库是通过默认情况下与 Peewee 库一起安装的游戏室扩展来处理的。

使用 Peewee 理解映射

模型映射到数据库表,字段映射到表列,实例映射到表行。

Peewee 利用 MySQL 的 MySQLDatabase、PostgreSQL 的 PostgresqlDatabase 和 SQLite 的 SqliteDatabase。对于下面的教程,我们将使用 SQLite 数据库。

了解 Peewee 中的字段类型

Peewee 模型中的字段类型定义了模型的存储类型。它们被转换为相应的数据库列类型。

| S.NO | 字段类型 | 数据库 | 一种数据库系统 | 关系型数据库 | | one | 夏菲尔德 | 可变长字符串 | 可变长字符串 | 可变长字符串 | | Two | TextField | 文本 | 文本 | 长文本 | | three | 日期时间字段 | 日期时间 | 时间戳 | 日期时间 | | four | 整数文件 | 整数 | 整数 | 整数 | | five | 布林栏位 | 斯莫列特 | 布尔代数学体系的 | 弯曲件 | | six | 浮动字段 | 真实的 | 真实的 | 真实的 | | seven | 双场 | 真实的 | 双倍精密度 | 双倍精密度 | | eight | 【big integrieffield】 | 整数 | 比吉斯本 | 比吉斯本 | | nine | 十进制字段 | 小数 | 数字的 | 数字的 | | Ten | PrimaryKeyField | 整数 | 连续的 | 整数 | | Eleven | ForeignKeyField | 整数 | 整数 | 整数 | | Twelve | 约会场 | 日期 | 日期 | 日期 | | Thirteen | 时间域 | 时间 | 时间 | 时间 |

上表列出了 Peewee 字段类型以及相应的 SQLite、PostgreSQL 和 MySQL 列类型。

使用 Peewee 定义模型

在第一个示例中,我们将创建一个简单的数据库表。

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
db = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = db
        db_table = 'notes'

# creating table
Notes.create_table()
noteOne = Notes.create(text = 'Went to the Gym')
noteOne.save()
noteTwo = Notes.create(text = 'Went to the Cinema', created = datetime.date(2021, 12, 8))
noteTwo.save()
noteThree = Notes.create(text = 'Watered the plants', created = datetime.date(2021, 12, 8))
noteThree.save()
noteFour = Notes.create(text = 'Listened to music')
noteFour.save()

输出:

sqlite> select * from notes;
1|Went to the Gym|2021-12-09
2|Went to the Cinema|2021-12-08
3|Watered the plants|2021-12-08
4|Listened to music|2021-12-09   

说明:

在上面的代码片段中,我们已经导入了所需的库。然后,我们创建了一个名为‘testspace . db’的数据库。然后我们创建了一个 Peewee 模型的类,并在其中添加了一些字段。我们为数据库创建了数据库表,并创建了该表。最后,我们在表中插入了条目并保存了数据库。

使用 Peewee 丢桌子

我们可以使用 drop_table() 功能来删除表格。让我们考虑下面的例子来证明这一点。

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining the class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)

    class Meta:
        database = dBase
        db_table = 'notes'
# using the drop_table() function to drop the table
Notes.drop_table()

说明:

在上面的代码片段中,我们已经导入了所需的库。然后,我们创建了一个名为‘testspace . db’的数据库。然后我们为 Peewee 模型定义了一个类【注释】,并创建了一个表。然后我们使用 drop_table() 函数来删除该表。

peewee insert _ multi()方法

Peewee 库的insert _ multi()方法用于执行批量创建操作。

让我们考虑下面的例子来证明这一点。

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)

    class Meta:

        database = dBase
        db_table = 'notes'
# creating table
Notes.create_table()
# defining the data
the_data = [
    { 'text': 'Visited friends in the morning', 'created': datetime.date(2021, 12, 7) },
    { 'text': 'Worked on a Project', 'created': datetime.date(2021, 12, 10) },
    { 'text': 'Went to Shopping mall', 'created': datetime.date(2021, 12, 6) },
    { 'text': 'Listened to songs', 'created': datetime.date(2021, 12, 2) },
    { 'text': 'Watched Web series all day', 'created': datetime.date(2021, 12, 4) },
    { 'text': 'Watered the plants', 'created': datetime.date(2021, 12, 2) },
    { 'text': 'Walked for half an hour', 'created': datetime.date(2021, 12, 8) }
]
with dBase.atomic():
    # using the insert_many() function to add entries in bulk
    the_query = Notes.insert_many(the_data)
    the_query.execute()

输出:

sqlite> select * from notes;
1|Went to the Gym|2021-12-10
2|Went to the Cinema|2021-12-08
3|Watered the plants|2021-12-08
4|Listened to music|2021-12-10
5|Visited friends in the morning|2021-12-07
6|Worked on a Project|2021-12-10
7|Went to Shopping mall|2021-12-06
8|Listened to songs|2021-12-02
9|Watched Web series all day|2021-12-04
10|Watered the plants|2021-12-02
11|Walked for half an hour|2021-12-08  

说明:

在上面的代码片段中,我们已经导入了所需的库。然后,我们创建了数据库和表。后来,我们在需要填入表格的字典列表中定义了数据。然后,我们执行了批量操作,并使用原子方法将批量操作放入事务中。

使用 Peewee 选择所有实例

Peewee 的选择方法用于检索已定义模型的实例。让我们考虑下面的例子来说明这一点:

示例:


# importing the required libraries
import peewee
import datetime
# creating the database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining the class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
# using the select() function
notes = Notes.select()
print(notes)
# iterating through each row in the table
for note in notes:
    print('{} on {}'.format(note.text, note.created))

输出:

$ python fetch_data.py
SELECT "t1"."id", "t1"."text", "t1"."created" FROM "notes" AS "t1"
Went to the Gym on 2021-12-10
Went to the Cinema on 2021-12-08
Watered the plants on 2021-12-08
Listened to music on 2021-12-10
Visited friends in the morning on 2021-12-07
Worked on a Project on 2021-12-10
Went to Shopping mall on 2021-12-06
Listened to songs on 2021-12-02
Watched Web series all day on 2021-12-04
Watered the plants on 2021-12-02
Walked for half an hour on 2021-12-08

说明:

在上面的代码片段中,我们已经导入了所需的库。然后,我们创建了数据库和表。然后,我们使用 select() 函数从表中选择列。然后,我们使用的循环遍历表中的每一行,并为用户打印它们。结果,程序为用户返回了条目。

使用 Peewee where 方法过滤数据

Peewee 的其中方法允许程序员根据指定的条件过滤数据。让我们考虑下面的例子来理解这一点:

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:

        database = dBase
        db_table = 'notes'
# using the where method to filter data
notes = Notes.select().where(Notes.id > 4)
# iterating through each row of the table
for note in notes:
    print('{} {} on {}'.format(note.id, note.text, note.created))

输出:

5 Visited friends in the morning on 2021-12-07
6 Worked on a Project on 2021-12-10
7 Went to Shopping mall on 2021-12-06
8 Listened to songs on 2021-12-02
9 Watched Web series all day on 2021-12-04
10 Watered the plants on 2021-12-02
11 Walked for half an hour on 2021-12-08   

说明:

在上面的代码片段中,我们已经导入了所需的库,并创建了一个数据库和表。然后,我们使用 where 方法和 select() 函数来过滤表中的数据。然后我们使用的循环遍历表格的每一行,并为用户打印数据。

Peewee 多个 where 表达式

我们可以多次使用方法,并将它们组合起来产生一个新的表达式,并精确过滤过程。让我们考虑下面的例子来证明这一点:

**示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
# using the where method to filter data
notes = Notes.select().where((Notes.id > 3) & (Notes.id < 10))
# iterating through each rows of the table
for note in notes:
    print('{} {} on {}'.format(note.id, note.text, note.created))

输出:

4 Listened to music on 2021-12-10
5 Visited friends in the morning on 2021-12-07
6 Worked on a Project on 2021-12-10
7 Went to Shopping mall on 2021-12-06
8 Listened to songs on 2021-12-02
9 Watched Web series all day on 2021-12-04   

说明:

我们已经导入了所需的库,并在上面的代码片段中创建了数据库和表。我们现在已经使用了方法,其中方法指定了限制,以便以特定的方式过滤数据。然后我们使用的循环遍历行,并为用户打印它们。

使用 Peewee 检索单个实例

我们可以使用两种方法来选择单个实例;它们中的每一个都利用了 get() 函数。

让我们考虑下面的例子来理解它的工作原理:

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
# first method
noteOne = Notes.select().where(Notes.text == 'Went to the Gym').get()
print(noteOne.id)
print(noteOne.text)
print(noteOne.created)
# second method
noteTwo = Notes.get(Notes.text == 'Worked on a Project')
print(noteTwo.id)
print(noteTwo.text)
print(noteTwo.created)

输出:

1
Went to the Gym
2021-12-10
6
Worked on a Project
2021-12-10

说明:

我们已经导入了所需的库,并在上面的代码片段中创建了数据库和表。为了检索单个实例,我们可以使用第一种方法,在第一种方法中,我们可以使用 where 方法以及 get() 函数,或者使用第二种方法,使用 get() 函数。以上示例中显示了这两种方法。

使用 Peewee 选择列

我们可以在选择方法中指定必须包含在查询中的列的名称。

下面是演示相同内容的示例:

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
# using the select() function
notes = Notes.select(Notes.text, Notes.created).limit(3)
output = [e for e in notes.tuples()]
print(output)

输出:

[('Went to the Gym', datetime.date(2021, 12, 10)), ('Went to the Cinema', datetime.date(2021, 12, 8)), ('Watered the plants', datetime.date(2021, 12, 8))]

说明:

我们已经导入了所需的库,并在上面的代码片段中创建了数据库和表。然后,我们使用 select() 函数指定必须选择的列的名称。我们还包括了限制功能,以限制要打印的条目数量。

使用 Peewee 计算实例

我们可以使用计数方法来计算表格中模型实例的数量。让我们考虑下面的例子来说明这一点:

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
# using the count() function
count1 = Notes.select().count()
print(count1)
count2 = Notes.select().where(Notes.created >= datetime.date(2021, 12, 7)).count()
print(count2)

输出:

11
7  

说明:

在上面的代码片段中,我们已经导入了所需的库,并创建了数据库和表。然后我们使用 count() 函数来计算条目的总数。然后,我们使用了 where() 功能来指定条目选择的限制,并再次使用了 count() 功能来仅打印所选条目的数量。

使用 Peewee 显示 SQL 语句

Peewee 库提供了 sql 方法,允许程序员生成 sql 语句。

让我们考虑下面的例子来说明这一点:

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
# selecting the specific entry
noteFour = Notes.select().where(Notes.id == 4)
# using the sql function
print(noteFour.sql())

输出:

('SELECT "t1"."id", "t1"."text", "t1"."created" FROM "notes" AS "t1" WHERE ("t1"."id" = ?)', [4]) 

说明:

我们已经导入了所需的库,并在上面的代码片段中创建了数据库和表。然后我们使用选择()功能和 where() 选择 id = 4 的条目。然后我们使用 sql 函数打印该选择操作的 sql 语句。

Peewee 偏移和限制属性

Peewee 还提供了几个属性,如偏移和限制,允许程序员定义实例的初始跳过和要包含在选择功能中的实例数量。

让我们考虑下面的例子来证明这一点:

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
# using the offset and limit attributes
the_notes = Notes.select().offset(3).limit(4)
# iterating through the entries in the table
for note in the_notes:
    print(note.id, note.text, note.created)

输出:

4 Listened to music 2021-12-10
5 Visited friends in the morning 2021-12-07
6 Worked on a Project 2021-12-10
7 Went to Shopping mall 2021-12-06   

说明:

我们已经导入了所需的库,并在上面的代码片段中创建了数据库和表。然后我们用选择()功能使用偏移和限制属性,以便选择从第 4 个条目到接下来三个条目的条目。

使用 Peewee 订购

我们可以使用 Peeweorder _ by函数来检索实例。让我们考虑下面的例子来证明这一点:

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
print('Ascending order')
print('********************************')
# using the order_by function. By default Ascending order
the_notes = Notes.select(Notes.text, Notes.created).order_by(Notes.created)
for note in the_notes:
    print(note.text, note.created)
print()
print('Descending order')
print('********************************')
# using the order_by function along with desc() function for descending order
the_notes = Notes.select(Notes.text, Notes.created).order_by(Notes.created.desc())
for note in the_notes:
    print(note.text, note.created)

输出:

Ascending order
********************************
Listened to songs 2021-12-02
Watered the plants 2021-12-02
Watched Web series all day 2021-12-04
Went to Shopping mall 2021-12-06
Visited friends in the morning 2021-12-07
Went to the Cinema 2021-12-08
Watered the plants 2021-12-08
Walked for half an hour 2021-12-08
Went to the Gym 2021-12-10
Listened to music 2021-12-10
Worked on a Project 2021-12-10

Descending order
********************************
Went to the Gym 2021-12-10
Listened to music 2021-12-10
Worked on a Project 2021-12-10
Went to the Cinema 2021-12-08
Watered the plants 2021-12-08
Walked for half an hour 2021-12-08
Visited friends in the morning 2021-12-07
Went to Shopping mall 2021-12-06
Watched Web series all day 2021-12-04
Listened to songs 2021-12-02
Watered the plants 2021-12-02    

说明:

我们已经导入了所需的库,并在上面的代码片段中创建了数据库和表。然后,我们使用选择功能和排序方式选择表格中的条目并按升序排列。然后我们使用循环的循环遍历每一行并打印它们。然后我们再次使用选择功能和按排序。但是,我们添加了 desc() 功能,以便按照降序排列条目,并借助于用于- 循环的为用户打印它们。

使用 Peewee 删除实例

Peewee 库提供了 delete_by_id 方法,允许程序员删除由其 id 标识的实例。此函数返回已删除实例的数量。

让我们考虑下面的例子来证明这一点:

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
# deleting the entry using ID
noteThree = Notes.delete_by_id(3)
# using the select() function
notes = Notes.select()
# iterating through each row in the table
for note in notes:
    print('{} - {} on {}'.format(note.id, note.text, note.created))

输出:

1 - Went to the Gym on 2021-12-10
2 - Went to the Cinema on 2021-12-08
4 - Listened to music on 2021-12-10
5 - Visited friends in the morning on 2021-12-07
6 - Worked on a Project on 2021-12-10
7 - Went to Shopping mall on 2021-12-06
8 - Listened to songs on 2021-12-02
9 - Watched Web series all day on 2021-12-04
10 - Watered the plants on 2021-12-02
11 - Walked for half an hour on 2021-12-08

说明:

我们已经导入了所需的库,并在上面的代码片段中创建了数据库和表。然后我们使用 delete_by_id() 函数删除 ID = 3 处的条目。然后我们为用户打印了整个表格。因此, ID = 3 处的条目已成功从表中删除。

使用 Peewee 删除多个实例

为了删除多个实例,我们可以调用 Peewee delete 方法。此方法将返回成功删除的实例数。

让我们考虑下面的例子来说明这一点:

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
# deleting multiple instances
the_query = Notes.delete().where(Notes.id > 3)
num = the_query.execute()
print('{} instances deleted'.format(num))

输出:

7 instances deleted

说明:

我们已经导入了所需的库,并在上面的代码片段中创建了数据库和表。然后,我们使用了 delete() 方法和 where() 方法来删除 id 在 3 以上的实例。因此,从表中删除了七个实例。

使用 Peewee 更新实例

我们可以使用 Peewee 更新方法来更新一个实例。它返回成功更新的实例数。

下面的例子证明了这一点:

示例:


# importing the required libraries
import peewee
import datetime
# creating a database
dBase = peewee.SqliteDatabase('testSpace.db')
# defining a class as Notes
class Notes(peewee.Model):
    text = peewee.CharField()
    created = peewee.DateField(default = datetime.date.today)
    class Meta:
        database = dBase
        db_table = 'notes'
# updating an instance
the_query = Notes.update(created=datetime.date(2021, 10, 27)).where(Notes.id == 2)
num = the_query.execute()
print('No. of rows updated: {}'.format(num))

输出:

No. of rows updated: 1

说明:

我们已经导入了所需的库,并在上面的代码片段中创建了数据库和表。然后我们使用 update() 函数在 ID = 2 处更新实例的日期。