Need help with peewee?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

8.6K Stars 1.3K Forks MIT License 4.3K Commits 1 Opened issues


a small, expressive orm -- supports postgresql, mysql and sqlite

Services available


Need anything else?

Contributors list

.. image::


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

.. image:: :target:

New to peewee? These may help:

  • Quickstart 
  • Example twitter app 
  • Using peewee interactively 
  • Models and fields 
  • Querying 
  • Relationships and joins 


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( is_published = BooleanField(default=True)

Connect to the database and create tables:

.. code-block:: python

db.create_tables([User, Tweet])

Create a few rows:

.. code-block:: python

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

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 = tweets =

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 >= & (Tweet.is_published == True)) .count())

Paginate the user table and show me page 3 (users 41-60)., 20)

Order users by the number of tweets they've created:

tweet_ct = fn.Count( 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 

Learning more

Check the

_ for more examples.

Specific question? Come hang out in the #peewee channel on, or post to the mailing list, . If you would like to report a bug,

create a new issue 
_ on GitHub.

Still want more info?

.. image::

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 
    _ as well as
    Part 2 
    _ and
    Part 3 
  • Analytics web service built with Flask and Peewee 
  • Personalized news digest (with a boolean query parser!) 
  • Structuring Flask apps with Peewee 
  • Creating a lastpass clone with Flask and Peewee 
  • Creating a bookmarking web-service that takes screenshots of your bookmarks 
  • Building a pastebin, wiki and a bookmarking service using Flask and Peewee 
  • Encrypted databases with Python and SQLCipher 
  • Dear Diary: An Encrypted, Command-Line Diary with Peewee 
  • Query Tree Structures in SQLite using Peewee and the Transitive Closure Extension 

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.