Skip to main content
  1. Posts/

Peewee - Python 轻量级 ORM 框架

·312 words·2 mins· loading · loading · · ·
Develop ORM Database Python
Table of Contents
ORM - This article is part of a series.
Part 1: This Article

简介
#

Peewee 是一个轻量级的 Python ORM 框架,适用于小型和中型的应用程序。它以简单易用为特点,能够快速处理常见的数据库操作,同时支持复杂的查询。

Python 常用的 ORM
#

  1. Django ORM
  • 优点:易用,学习曲线短;和Django紧密集合,用Django时使用约定俗成的方法去操作数据库
  • 缺点:QuerySet速度不给力
  1. peewee
  • 优点:Django式的API,使其易用;轻量实现,很容易和任意web框架集成
  • 缺点:不支持自动化 schema 迁移;不能像Django那样,使线上的mysql表结构生成结构化的模型。
  1. [[SQLAlchemy]]
  • 优点:API 非常厉害,使得代码有健壮性和适应性;灵活的设计,使得能轻松写复杂查询
  • 缺点:工作单元概念不常见;重量级 API,导致长学习曲线

安装
#

安装 Peewee 非常简单:

pip install peewee

基本概念
#

在 ORM 对象关系数据库中 Model 是一个类,映射到数据库表中就是一个表。Filed 是字段,映射到表中就是字段。Model 实例就是数据库中的一条记录。

Thing 对应关系
Model 类
Field 实例 表中字段
Model 实例 表中数据

Peewee 基本使用
#

image.png

定义模型
#

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:定义外键。

Ref
#

awsling
Author
awsling
A Web Developer, Product Designer & Elysia’s Stalker
ORM - This article is part of a series.
Part 1: This Article

Related

消息队列概述
·89 words·1 min· loading · loading
Develop MQ
消息队列:Kafka
·533 words·3 mins· loading · loading
Develop MQ