Peewee

一个小而富有表现力的 orm -- 支持 postgresql、mysql 和 sqlite。「a small, expressive orm -- supports postgresql, mysql and sqlite.」

Github stars Tracking Chart

peewee

Peewee 是一个简单而小巧的 ORM。它的概念很少(但很有表现力),因此它很容易学习和直观使用。

  • 一个小型的、有表现力的 ORM
  • python 2.7+ 和 3.4+ (用 3.6 开发)
  • 支持 sqlite、mysql、postgresql 和 cockroachdb。
  • 大量的扩展

新手接触 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()
# No need to set `is_published` or `created_date` since they
# will just use the default values we specified.
Tweet.create(user=charlie, message='My first tweet')
Queries are expressive and composable:
# A simple query selecting a user.
User.get(User.username == 'charlie')
# Get tweets created by one of several users.
usernames = ['charlie', 'huey', 'mickey']
users = User.select().where(User.username.in_(usernames))
tweets = Tweet.select().where(Tweet.user.in_(users))
# We could accomplish the same using a JOIN:
tweets = (Tweet
          .select()
          .join(User)
          .where(User.username.in_(usernames)))
# How many tweets were published today?
tweets_today = (Tweet
                .select()
                .where(
                    (Tweet.created_date >= datetime.date.today()) &
                    (Tweet.is_published == True))
                .count())
# Paginate the user table and show me page 3 (users 41-60).
User.select().order_by(User.username).paginate(3, 20)
# Order users by the number of tweets they've created:
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()))
# Do an atomic update
Counter.update(count=Counter.count + 1).where(Counter.url == request.url)

查看 twitter 应用示例

学习更多

查看文档,了解更多的例子。

具体问题?来 irc.freenode.net 上的 #peewee 频道闲逛,或者发帖到邮件列表,http://groups.google.com/group/peewee-orm 。如果你想报告一个 bug,请在 GitHub 上创建一个新问题

还想了解更多信息?

我已经写了很多关于使用 peewee(通常是 Flask)构建应用程序和 Web 服务的博客文章。如果你想看一些使用 peewee 的实际应用,下面的资源可能会很有用。


(The first version translated by vz on 2020.09.13)

Main metrics

Overview
Name With Ownercoleifer/peewee
Primary LanguagePython
Program languagePython (Language Count: 4)
PlatformLinux, Mac, Windows
License:MIT License
所有者活动
Created At2010-10-11 20:14:11
Pushed At2025-06-02 18:53:31
Last Commit At2025-06-02 13:52:59
Release Count197
Last Release Name3.18.1 (Posted on )
First Release Name0.1.0 (Posted on )
用户参与
Stargazers Count11.6k
Watchers Count197
Fork Count1.4k
Commits Count4.7k
Has Issues Enabled
Issues Count2492
Issue Open Count0
Pull Requests Count188
Pull Requests Open Count0
Pull Requests Close Count302
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private

.. image:: http://media.charlesleifer.com/blog/photos/peewee3-logo.png

peewee

Peewee is a simple and small ORM. It has few (but expressive) concepts, making it easy to learn and intuitive to use.

  • a small, expressive ORM
  • python 2.7+ and 3.4+ (developed with 3.6)
  • supports sqlite, mysql, postgresql and cockroachdb
  • tons of extensions <http://docs.peewee-orm.com/en/latest/peewee/playhouse.html>_

.. image:: https://travis-ci.org/coleifer/peewee.svg?branch=master
:target: https://travis-ci.org/coleifer/peewee

New to peewee? These may help:

  • Quickstart <http://docs.peewee-orm.com/en/latest/peewee/quickstart.html#quickstart>_
  • Example twitter app <http://docs.peewee-orm.com/en/latest/peewee/example.html>_
  • Using peewee interactively <http://docs.peewee-orm.com/en/latest/peewee/interactive.html>_
  • Models and fields <http://docs.peewee-orm.com/en/latest/peewee/models.html>_
  • Querying <http://docs.peewee-orm.com/en/latest/peewee/querying.html>_
  • Relationships and joins <http://docs.peewee-orm.com/en/latest/peewee/relationships.html>_

Examples

Defining models is similar to Django or SQLAlchemy:

.. code-block:: python

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)

Connect to the database and create tables:

.. code-block:: python

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

Create a few rows:

.. code-block:: python

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

# No need to set `is_published` or `created_date` since they
# will just use the default values we specified.
Tweet.create(user=charlie, message='My first tweet')

Queries are expressive and composable:

.. code-block:: python

# A simple query selecting a user.
User.get(User.username == 'charlie')

# Get tweets created by one of several users.
usernames = ['charlie', 'huey', 'mickey']
users = User.select().where(User.username.in_(usernames))
tweets = Tweet.select().where(Tweet.user.in_(users))

# We could accomplish the same using a JOIN:
tweets = (Tweet
          .select()
          .join(User)
          .where(User.username.in_(usernames)))

# How many tweets were published today?
tweets_today = (Tweet
                .select()
                .where(
                    (Tweet.created_date >= datetime.date.today()) &
                    (Tweet.is_published == True))
                .count())

# Paginate the user table and show me page 3 (users 41-60).
User.select().order_by(User.username).paginate(3, 20)

# Order users by the number of tweets they've created:
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()))

# Do an atomic update
Counter.update(count=Counter.count + 1).where(Counter.url == request.url)

Check out the example twitter app <http://docs.peewee-orm.com/en/latest/peewee/example.html>_.

Learning more

Check the documentation <http://docs.peewee-orm.com/>_ for more examples.

Specific question? Come hang out in the #peewee channel on irc.freenode.net, or post to the mailing list, http://groups.google.com/group/peewee-orm . If you would like to report a bug, create a new issue <https://github.com/coleifer/peewee/issues/new>_ on GitHub.

Still want more info?

.. image:: http://media.charlesleifer.com/blog/photos/wat.jpg

I've written a number of blog posts about building applications and web-services with peewee (and usually Flask). If you'd like to see some real-life applications that use peewee, the following resources may be useful:

  • Building a note-taking app with Flask and Peewee <http://charlesleifer.com/blog/saturday-morning-hack-a-little-note-taking-app-with-flask/>_ as well as Part 2 <http://charlesleifer.com/blog/saturday-morning-hacks-revisiting-the-notes-app/>_ and Part 3 <http://charlesleifer.com/blog/saturday-morning-hacks-adding-full-text-search-to-the-flask-note-taking-app/>_.
  • Analytics web service built with Flask and Peewee <http://charlesleifer.com/blog/saturday-morning-hacks-building-an-analytics-app-with-flask/>_.
  • Personalized news digest (with a boolean query parser!) <http://charlesleifer.com/blog/saturday-morning-hack-personalized-news-digest-with-boolean-query-parser/>_.
  • Structuring Flask apps with Peewee <http://charlesleifer.com/blog/structuring-flask-apps-a-how-to-for-those-coming-from-django/>_.
  • Creating a lastpass clone with Flask and Peewee <http://charlesleifer.com/blog/creating-a-personal-password-manager/>_.
  • Creating a bookmarking web-service that takes screenshots of your bookmarks <http://charlesleifer.com/blog/building-bookmarking-service-python-and-phantomjs/>_.
  • Building a pastebin, wiki and a bookmarking service using Flask and Peewee <http://charlesleifer.com/blog/dont-sweat-small-stuff-use-flask-blueprints/>_.
  • Encrypted databases with Python and SQLCipher <http://charlesleifer.com/blog/encrypted-sqlite-databases-with-python-and-sqlcipher/>_.
  • Dear Diary: An Encrypted, Command-Line Diary with Peewee <http://charlesleifer.com/blog/dear-diary-an-encrypted-command-line-diary-with-python/>_.
  • Query Tree Structures in SQLite using Peewee and the Transitive Closure Extension <http://charlesleifer.com/blog/querying-tree-structures-in-sqlite-using-python-and-the-transitive-closure-extension/>_.