Peewee:一个轻量小巧的 Python ORM,11k+ Star

peewee 是一款简单小巧的 Python ORM,目前积累了 11,969 个 Star:

正文顶部截图

README区域截图

它的设计目标是保持概念精简,让开发者可以快速上手,同时提供灵活的查询构造能力。代码库体积不大,核心概念清晰,文档也比较完善。

peewee 支持 SQLite、MySQL、MariaDB 和 PostgreSQL 四种主流数据库,也提供了 asyncio 异步支持。它与 Flask、FastAPI、Pydantic 等框架都能良好集成。

安装方式很直接:

pip install peewee

针对不同数据库,可以选择对应的安装方式:

pip install peewee[mysql]
pip install peewee[postgres]
pip install peewee[psycopg3]

异步场景下也有对应的包:

pip install peewee[aiosqlite]
pip install peewee[aiomysql]
pip install peewee[asyncpg]

定义模型

peewee 的模型定义方式与 Django 或 SQLAlchemy 类似:

from peewee import *
import datetime


db = SqliteDatabase('my_database.db')

class BaseModel(Model):
    class Meta:
        database = db

class User(BaseModel):
    username = CharField(unique=True)

class Tweet(BaseModel):
    user = ForeignKeyField(User, backref='tweets')
    message = TextField()
    created_date = DateTimeField(default=datetime.datetime.now)
    is_published = BooleanField(default=True)

连接数据库并创建表:

db.connect()
db.create_tables([User, Tweet])

创建数据:

charlie = User.create(username='charlie')
huey = User(username='huey')
huey.save()

Tweet.create(user=charlie, message='My first tweet')

字段默认值在创建时会自动填充,不需要手动设置。


查询操作

peewee 的查询语法比较直观,支持链式调用和组合查询:

# 单条查询
User.get(User.username == 'charlie')

# IN 查询
usernames = ['charlie', 'huey', 'mickey']
users = User.select().where(User.username.in_(usernames))

# JOIN 查询
tweets = (Tweet
          .select()
          .join(User)
          .where(User.username.in_(usernames)))

# 条件计数
tweets_today = (Tweet
                .select()
                .where(
                    (Tweet.created_date >= datetime.date.today()) &
                    (Tweet.is_published == True))
                .count())

# 分页
User.select().order_by(User.username).paginate(3, 20)

# 聚合排序
tweet_ct = fn.Count(Tweet.id)
users = (User
         .select(User, tweet_ct.alias('ct'))
         .join(Tweet, JOIN.LEFT_OUTER)
         .group_by(User)
         .order_by(tweet_ct.desc()))

原子更新也可以直接通过查询完成,避免并发竞争:

Counter.update(count=Counter.count + 1).where(Counter.url == request.url)

这些查询方式覆盖了日常开发中的大部分需求。


扩展生态

peewee 的 playhouse 模块提供了很多扩展功能,包括数据库迁移、CSV 导入导出、全文搜索等。社区也提供了不少第三方插件,可以按需选用。官方还提供了多个示例项目,包括一个完整的 Twitter 克隆应用,可以帮助新手理解最佳实践。

与 SQLAlchemy 相比,peewee 的学习曲线更平缓,适合中小型项目或需要快速交付的场景。它的 API 设计比较一致,没有过多的抽象层次。对于需要轻量级 ORM 的 Python 项目来说,peewee 是一个值得考虑的选择。

可以帮助新手理解最佳实践。

与 SQLAlchemy 相比,peewee 的学习曲线更平缓,适合中小型项目或需要快速交付的场景。它的 API 设计比较一致,没有过多的抽象层次。对于需要轻量级 ORM 的 Python 项目来说,peewee 是一个值得考虑的选择。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐