coleifer/peewee
coleifer/peewee has 12,003 GitHub stars and 1,386 forks. GitHot measured -2 in 7 days. Last checked 2026-11-10 04:43 UTC. Last push 2026-11-05.
Comment ces chiffres sont mesurés
a small, expressive orm -- supports postgresql, mysql, sqlite, now with asyncio
Progression mesurée des étoiles
- in 24h
- Mise à jour retardée
- in 7 days
- -2
- in 15 days
- Mise à jour retardée
- in 1 month
- Mise à jour retardée
Variations nettes sur des périodes qui se chevauchent, pas des totaux quotidiens. Les mesures absentes restent vides. Les étoiles indiquent l’intérêt, pas la qualité.
README.md
Original.. image:: https://media.charlesleifer.com/blog/photos/peewee4-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.
Peewee is a single module with no required dependencies and has been running production workloads of all sizes since 2010.
- a small, expressive ORM
- flexible query-builder that exposes full power of SQL
- supports sqlite, mysql, mariadb, postgresql
asyncio support <https://docs.peewee-orm.com/en/latest/peewee/asyncio.html>__ built on the standard async drivers (aiosqlite, asyncpg, aiomysql)schema migrations <https://docs.peewee-orm.com/en/latest/peewee/db_tools.html#migration-runner>__ with diff-based generation (pwmigrate)- tons of extensions
- use with
flask <https://docs.peewee-orm.com/en/latest/peewee/framework_integration.html#flask>,fastapi <https://docs.peewee-orm.com/en/latest/peewee/framework_integration.html#fastapi>,pydantic <https://docs.peewee-orm.com/en/latest/peewee/orm_utils.html#module-playhouse.pydantic_utils>, andmore <https://docs.peewee-orm.com/en/latest/peewee/framework_integration.html>.
New to peewee? These may help:
Quickstart <https://docs.peewee-orm.com/en/latest/peewee/quickstart.html#quickstart>_Example twitter app <https://docs.peewee-orm.com/en/latest/peewee/example.html#example>_Using peewee interactively <https://docs.peewee-orm.com/en/latest/peewee/interactive.html#interactive>_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>_Extensive library of SQL / Peewee examples <https://docs.peewee-orm.com/en/latest/peewee/query_library.html#query-library>_Flask setup <https://docs.peewee-orm.com/en/latest/peewee/framework_integration.html#flask>_ orFastAPI setup <https://docs.peewee-orm.com/en/latest/peewee/framework_integration.html#fastapi>_
Installation:
.. code-block:: console
pip install peewee
Sqlite comes built-in provided by the standard-lib sqlite3 module. Other
backends can be installed using the following instead:
.. code-block:: console
pip install peewee[mysql] # Install peewee with pymysql.
pip install peewee[postgres] # Install peewee with psycopg2.
pip install peewee[psycopg3] # Install peewee with psycopg3.
# AsyncIO implementations.
pip install peewee[aiosqlite] # Install peewee with aiosqlite.
pip install peewee[aiomysql] # Install peewee with aiomysql.
pip install peewee[asyncpg] # Install peewee with asyncpg.
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 (for illustrative purposes only, imagine a simple
# table for tracking a "count" associated with each URL). We don't want to
# naively get the save in two separate steps since this is prone to race
# conditions.
Counter.update(count=Counter.count + 1).where(Counter.url == request.url).execute()
Check out the example twitter app <http://docs.peewee-orm.com/en/latest/peewee/example.html>_.
Asyncio
.. code-block:: python
import asyncio
from peewee import *
from playhouse.pwasyncio import AsyncPostgresqlDatabase
db = AsyncPostgresqlDatabase('my_app')
class User(db.Model):
username = CharField(unique=True)
class Tweet(db.Model):
user = ForeignKeyField(User, backref='tweets')
message = TextField()
async def main():
async with db:
await db.acreate_tables([User, Tweet])
# Queries are awaited on the event loop using asyncpg.
huey = await User.acreate(username='huey')
tweet = await Tweet.acreate(user=huey, message='meow')
async with db.atomic():
tweet.message = 'purr'
await tweet.asave()
# Create a query - nothing is executed yet.
query = Tweet.select(Tweet, User).join(User)
# Execute and buffer the results.
tweets = await query.aexecute() # Or: await db.list(query)
for tweet in tweets:
print(tweet.user.username, '->', tweet.message)
# Streaming results via server-side cursor.
async for tweet in db.iterate(query):
print(tweet.user.username, '->', tweet.message)
await db.close_pool()
asyncio.run(main())
See the asyncio docs <https://docs.peewee-orm.com/en/latest/peewee/asyncio.html>_
for details.
Learning more
Check the documentation <http://docs.peewee-orm.com/>_ for more examples.
Specific question? Come hang out in the #peewee channel on irc.libera.chat, 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:: https://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 <https://charlesleifer.com/blog/saturday-morning-hack-a-little-note-taking-app-with-flask/>_ as well asPart 2 <https://charlesleifer.com/blog/saturday-morning-hacks-revisiting-the-notes-app/>_ andPart 3 <https://charlesleifer.com/blog/saturday-morning-hacks-adding-full-text-search-to-the-flask-note-taking-app/>_.Analytics web service built with Flask and Peewee <https://charlesleifer.com/blog/saturday-morning-hacks-building-an-analytics-app-with-flask/>_.Personalized news digest (with a boolean query parser!) <https://charlesleifer.com/blog/saturday-morning-hack-personalized-news-digest-with-boolean-query-parser/>_.Structuring Flask apps with Peewee <https://charlesleifer.com/blog/structuring-flask-apps-a-how-to-for-those-coming-from-django/>_.Creating a lastpass clone with Flask and Peewee <https://charlesleifer.com/blog/creating-a-personal-password-manager/>_.Creating a bookmarking web-service that takes screenshots of your bookmarks <https://charlesleifer.com/blog/building-bookmarking-service-python-and-phantomjs/>_.Building a pastebin, wiki and a bookmarking service using Flask and Peewee <https://charlesleifer.com/blog/dont-sweat-small-stuff-use-flask-blueprints/>_.Encrypted databases with Python and SQLCipher <https://charlesleifer.com/blog/encrypted-sqlite-databases-with-python-and-sqlcipher/>_.Dear Diary: An Encrypted, Command-Line Diary with Peewee <https://charlesleifer.com/blog/dear-diary-an-encrypted-command-line-diary-with-python/>_.
Explorer des projets similaires
Asabeneh/30-Days-Of-Python
Le défi de programmation 30 Days of Python est un guide pas à pas pour apprendre le langage de programmation Python en 30 jours. Ce défi peut prendre plus de 100 jours. Avancez à votre rythme. Ces vidéos peuvent aussi vous aider : https://www.youtube.com/channel/UC7PNRuno1rzYPb1xLa4yktw
78,560 étoilesgrafana/grafana
Plateforme ouverte et composable d’observabilité et de visualisation de données. Visualise les métriques, les journaux et les traces issus de plusieurs sources, comme Prometheus, Loki, Elasticsearch, InfluxDB, Postgres et bien d’autres.
77,830 étoilesredis/redis
Pour les développeurs qui créent des applications en temps réel pilotées par les données, Redis est le cache, le serveur de structures de données et le moteur de requêtes documentaires et vectorielles préféré, le plus rapide et le plus riche en fonctionnalités.
77,395 étoilesapache/superset
Apache Superset est une plateforme de visualisation et d'exploration de données.
75,473 étoiles