【Peewee与SQLite亲密接触】:打造轻量级数据库应用
发布时间: 2024-10-01 11:26:22 阅读量: 4 订阅数: 10
![python库文件学习之peewee](https://opengraph.githubassets.com/c1cc319e94e006a1e210b22798a6a681267d468bf09e28d3afe69dc8614e47b8/aachurin/peewee_migrations)
# 1. Peewee与SQLite简介
## 1.1 Peewee简介
Peewee是一个小型且易于使用的Python ORM(对象关系映射),它使得数据库操作更接近Python的原生代码,而无需复杂的SQL语句。由于其轻量级的特性,Peewee适合用于小型项目和原型开发,同时也支持生产环境中的使用。
## 1.2 SQLite简介
SQLite是一个嵌入式数据库引擎,它不需要服务器进程运行,因此部署起来非常简单。作为轻量级的数据库解决方案,SQLite通常用于小型应用或移动设备中,但它也能够处理大量的数据和复杂的查询。
## 1.3 Peewee与SQLite的结合
将Peewee与SQLite结合使用,可以让开发者以Pythonic的方式快速搭建起数据库应用。由于SQLite的轻便性和Peewee的简洁性,这种组合非常适合快速开发和小型项目的部署。
```python
from peewee import *
# 定义Peewee模型与SQLite数据库连接
db = SqliteDatabase('my_database.db')
class BaseModel(Model):
class Meta:
database = db
class User(BaseModel):
username = CharField(unique=True)
password = CharField()
# 创建表
db.connect()
db.create_tables([User], safe=True)
```
在上述代码中,我们首先导入了Peewee库,并定义了一个SQLite数据库对象以及一个基础模型`BaseModel`。随后,我们创建了一个`User`模型来表示用户表,并通过`db.create_tables()`方法在SQLite中创建了对应的用户表。这展示了如何将Peewee与SQLite结合使用来快速搭建数据库模型和结构。
# 2. Peewee基础
### 2.1 Peewee模型定义与字段类型
#### 2.1.1 模型基础结构
Peewee中的模型(Model)类是数据库表结构的抽象,开发者通过定义模型类并继承自`peewee.Model`来指定数据库表的结构。模型的每个属性对应一个表的列(Field)。定义模型通常包含以下步骤:
1. 导入Peewee提供的字段类型和模型基类。
2. 定义模型类并继承自`peewee.Model`。
3. 在模型类内定义类属性,每个属性都是一个`Field`实例,代表数据库表中的一个列。
例如,定义一个`User`模型,包含`id`、`username`和`password`字段:
```python
from peewee import *
# 连接数据库,这里使用SQLite内存数据库,文件名为test.db
db = SqliteDatabase('test.db')
# 定义模型基类
class BaseModel(Model):
class Meta:
database = db
# 定义User模型,继承BaseModel
class User(BaseModel):
id = PrimaryKeyField() # 主键
username = CharField() # 字符类型字段,不可为空
password = CharField() # 字符类型字段,不可为空
# 创建数据库连接,并执行数据库同步
db.connect()
db.create_tables([User]) # 这里会创建名为User的表
```
执行上述代码后,Peewee会自动在数据库中创建一个名为`User`的表,并定义了三个字段:`id`(主键,自动增长),`username`(字符类型),和`password`(字符类型)。
#### 2.1.2 常用字段类型和属性
Peewee支持多种字段类型,每种类型代表一种数据库列的数据类型,例如`CharField`用于文本存储,`IntegerField`用于整数存储。字段类型不仅定义了数据存储的格式,还提供了一些额外的属性来满足不同的需求。下面列举一些常用的字段类型及其属性:
- `CharField`:用于存储字符串,常用属性包括`max_length`(最大长度)。
- `IntegerField`:用于存储整数,支持`choices`属性来限制可选值。
- `BooleanField`:用于存储布尔值,如`True/False`或`1/0`。
- `DateTimeField`:用于存储日期和时间,常用属性包括`auto_now_add`和`auto_now`。
- `ForeignKeyField`:用于建立表之间的关联,常用属性包括`related_name`。
- `TextField`:用于存储大文本,如文章内容或评论。
```python
from datetime import datetime
class Post(BaseModel):
title = CharField(max_length=255) # 标题最大长度为255字符
content = TextField() # 内容为长文本
published_date = DateTimeField(default=datetime.now) # 发布时间,默认为当前时间
author = ForeignKeyField(User, backref='posts') # 关联到User模型
```
在这个`Post`模型的例子中,`title`字段设置了最大长度为255的字符类型字段,`content`字段是一个长文本字段,`published_date`字段是一个日期时间字段,且默认值为创建记录时的当前时间,`author`字段使用外键关联到了`User`模型,并且在`User`模型中通过`backref='posts'`自动创建了一个反向引用。
### 2.2 数据操作与查询
#### 2.2.1 数据的增删改查操作
Peewee提供了非常直观和便捷的方式来完成数据的增删改查(CRUD)操作。通过调用模型实例上的方法可以轻松进行这些操作。以下是一些常见的数据操作方法:
- `create()`: 创建并保存一个新的模型实例。
- `get()`: 根据主键或者一组条件查询单个对象。
- `get_or_create()`: 尝试获取对象,如果不存在则创建。
- `select()`: 执行选择查询,返回查询对象的列表。
- `update()`: 更新满足条件的记录。
- `delete_instance()`: 删除一个模型实例。
下面是一个使用这些方法的例子:
```python
# 创建一个用户
new_user = User.create(username='newuser', password='newpass')
# 获取一个用户
user = User.get(User.username == 'newuser')
# 更新用户密码
user.password = 'updatedpass'
user.update_instance()
# 删除用户
user.delete_instance()
```
#### 2.2.2 条件查询与聚合函数
在Peewee中,可以使用`where()`、`order_by()`、`limit()`等方法进行复杂条件查询,也可以使用聚合函数(如`COUNT()`, `SUM()`, `AVG()`等)来完成对数据集的统计分析。通过定义查询对象,然后链式调用条件和聚合方法,可以构建出非常灵活的查询逻辑。
```python
# 查询用户名为'newuser'的用户
users = User.select().where(User.username == 'newuser')
# 查询密码为'updatedpass'的用户数量
user_count = User.select().where(User.password == 'updatedpass').count()
# 查询平均密码长度
average_length = User.select(fn.length(User.password).avg()).scalar()
# 选择用户名,按用户名排序,前5条
top_users = User.select(User.username).order_by(User.username).limit(5)
```
在这个示例中,使用`select()`方法来选择需要的数据列,`where()`方法来设定查询条件,`order_by()`来设定排序方式,`limit()`来限制查询结果数量。此外,使用了Peewee提供的`fn.length()`和`avg()`函数来进行数据库层面的聚合计算。
### 2.3 关系映射与事务处理
#### 2.3.1 一对多、多对多关系映射
关系映射是数据库操作中不可或缺的一部分。Peewee通过模型之间的外键关联来实现一对多、多对多等关系映射。具体操作如下:
- 一对多关系映射通过在“多”方模型中添加一个指向“一”方模型的外键字段来实现。例如,一篇文章可以对应多个评论。
- 多对多关系映射通过创建一个关联模型(也称为中间模型),包含两个外键字段,分别指向关联的两个模型。例如,一个用户可以订阅多个标签,一个标签可以被多个用户订阅。
```python
class Comment(BaseModel):
post = ForeignKeyField(Post, backref='comments')
content = TextField()
class Tag(BaseModel):
name = CharField()
class PostTag(BaseModel):
post = ForeignKeyField(Post, backref='post_tags')
tag = ForeignKeyField(Tag, backref='post_tags')
# 添加评论
comment = Comment(post=1, content='Great post!')
# 添加标签
tag = Tag.create(name='News')
# 将标签与文章关联
PostTag.create(post=1, tag=tag)
```
在这个例子中,我们首先创建了一个`Comment`模型和一个`Tag`模型,并通过`PostTag`这个关联模型来实现文章和标签之间的多对多关系。
#### 2.3.2 事务的使用和管理
数据库事务保证了数据的一致性和完整性。在Peewee中,可以使用`transaction()`上下文管理器来控制事务,确保一系列操作要么全部成功,要么全部回滚。
```python
from peewee import *
# 使用事务处理代码
def do_something_in_transaction():
with db.atomic(): # 开始一个原子操作块
user = User.create(username='transactionuser', password='txtpass')
post = Post.create(
```
0
0