简介 #
Peewee 是一个轻量级的 Python ORM 框架,适用于小型和中型的应用程序。它以简单易用为特点,能够快速处理常见的数据库操作,同时支持复杂的查询。
Python 常用的 ORM #
- Django ORM
- 优点:易用,学习曲线短;和Django紧密集合,用Django时使用约定俗成的方法去操作数据库
- 缺点:QuerySet速度不给力
- peewee
- 优点:Django式的API,使其易用;轻量实现,很容易和任意web框架集成
- 缺点:不支持自动化 schema 迁移;不能像Django那样,使线上的mysql表结构生成结构化的模型。
- [[SQLAlchemy]]
- 优点:API 非常厉害,使得代码有健壮性和适应性;灵活的设计,使得能轻松写复杂查询
- 缺点:工作单元概念不常见;重量级 API,导致长学习曲线
安装 #
安装 Peewee 非常简单:
pip install peewee
基本概念 #
在 ORM 对象关系数据库中 Model 是一个类,映射到数据库表中就是一个表。Filed 是字段,映射到表中就是字段。Model 实例就是数据库中的一条记录。
| Thing | 对应关系 |
|---|---|
| Model 类 | 表 |
| Field 实例 | 表中字段 |
| Model 实例 | 表中数据 |
Peewee 基本使用 #
定义模型 #
Peewee 的模型类通过继承 peewee.Model 来定义,每个模型对应数据库中的一张表,字段通过 peewee.Field 类来定义。
from peewee import *
# 定义数据库
db = MySQLDatabase(
"test", host="127.0.0.1", port=3306, user="root", passwd="123456"
)
# 定义模型类
class BaseModel(Model):
class Meta:
database = db
class User(BaseModel):
username = CharField(unique=True)
email = CharField()
class Tweet(BaseModel):
user = ForeignKeyField(User, backref='tweets')
content = TextField()
created_date = DateTimeField(constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')])
连接数据库 #
使用 Peewee 时,模型类通过数据库对象绑定到某个数据库。在进行操作之前,需要先连接数据库。
db.connect()
创建表 #
通过 create_tables 方法可以创建数据库表。
db.create_tables([User, Tweet])
插入数据 #
可以通过模型类的 create() 方法插入数据。
# 创建一个用户
user = User.create(username='JohnDoe', email='[email protected]')
# 创建一条 Tweet
tweet = Tweet.create(user=user, content='My first tweet!')
查询数据 #
查询是 ORM 的核心之一,Peewee 提供了各种查询方法。
基本查询 #
# 获取所有用户
users = User.select()
for user in users:
print(user.username, user.email)
过滤查询 #
可以使用 where() 方法进行过滤查询。
# 查询用户名为 JohnDoe 的用户
john = User.get(User.username == 'JohnDoe')
# 获取所有 JohnDoe 发布的推文
tweets = Tweet.select().where(Tweet.user == john)
for tweet in tweets:
print(tweet.content)
更新数据 #
可以通过 update() 方法来更新数据库中的数据。
# 更新用户的 email
User.update(email='[email protected]').where(User.username == 'JohnDoe').execute()
删除数据 #
可以通过 delete_instance() 方法删除某个对象。
# 删除某个推文
tweet_to_delete = Tweet.get(Tweet.content == 'My first tweet!')
tweet_to_delete.delete_instance()
使用外键 #
Peewee 支持外键,通过 ForeignKeyField 可以轻松定义模型之间的关系。
# 获取某个用户的所有推文
user = User.get(User.username == 'JohnDoe')
for tweet in user.tweets:
print(tweet.content)
Peewee 进阶 #
事务处理 #
事务可以通过 atomic() 上下文管理器来实现,确保在事务中的操作要么全部成功,要么全部失败。
with db.atomic():
user = User.create(username='JaneDoe', email='[email protected]')
Tweet.create(user=user, content='Jane\'s first tweet!')
复杂查询 #
Peewee 支持复杂的 SQL 查询,比如 JOIN、GROUP BY、子查询等。
# 获取每个用户的推文数量
query = (User
.select(User, fn.COUNT(Tweet.id).alias('tweet_count'))
.join(Tweet, JOIN.LEFT_OUTER)
.group_by(User))
for user in query:
print(user.username, user.tweet_count)
自定义查询 #
可以通过 raw() 方法执行自定义 SQL 语句。
query = db.execute_sql('SELECT * FROM user WHERE username = %s', ('JohnDoe',))
for row in query:
print(row)
Peewee 常用字段类型 #
CharField:用于存储字符串。TextField:用于存储大段文本。IntegerField:存储整数。BooleanField:存储布尔值。DateTimeField:用于存储日期时间。ForeignKeyField:定义外键。