Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Strapi | 52,729 | 221 | 113 | 9 hours ago | 281 | May 11, 2022 | 352 | other | JavaScript | |
🚀 Strapi is the leading open-source headless CMS. It’s 100% JavaScript, fully customizable and developer-first. | ||||||||||
Nocodb | 35,126 | 3 | 10 hours ago | 110 | September 06, 2022 | 416 | agpl-3.0 | TypeScript | ||
🔥 🔥 🔥 Open Source Airtable Alternative | ||||||||||
Dbeaver | 31,296 | 11 hours ago | 1,776 | apache-2.0 | Java | |||||
Free universal database tool and SQL client | ||||||||||
Typeorm | 30,861 | 1,994 | 2,164 | a day ago | 650 | September 20, 2022 | 1,930 | mit | TypeScript | |
ORM for TypeScript and JavaScript. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana, WebSQL databases. Works in NodeJS, Browser, Ionic, Cordova and Electron platforms. | ||||||||||
Prisma | 30,128 | 442 | 12 hours ago | 4,993 | September 24, 2022 | 2,800 | apache-2.0 | TypeScript | ||
Next-generation ORM for Node.js & TypeScript | PostgreSQL, MySQL, MariaDB, SQL Server, SQLite, MongoDB and CockroachDB | ||||||||||
Directus | 20,775 | 50 | 10 hours ago | 55 | September 22, 2022 | 352 | gpl-3.0 | TypeScript | ||
The Modern Data Stack 🐰 — Directus is an instant REST+GraphQL API and intuitive no-code data collaboration app for any SQL database. | ||||||||||
Knex | 17,368 | 18,096 | 2,788 | 13 hours ago | 248 | August 31, 2022 | 811 | mit | JavaScript | |
A query builder for PostgreSQL, MySQL, CockroachDB, SQL Server, SQLite3 and Oracle, designed to be flexible, portable, and fun to use. | ||||||||||
Beekeeper Studio | 12,696 | 2 days ago | 489 | gpl-3.0 | Vue | |||||
Modern and easy to use SQL client for MySQL, Postgres, SQLite, SQL Server, and more. Linux, MacOS, and Windows. | ||||||||||
Migrate | 11,081 | 594 | 4 days ago | 129 | March 17, 2022 | 260 | other | Go | ||
Database migrations. CLI and Golang library. | ||||||||||
Diesel | 10,140 | 823 | 298 | a day ago | 60 | August 29, 2022 | 122 | apache-2.0 | Rust | |
A safe, extensible ORM and Query Builder for Rust |
Peewee is a simple and small ORM. It has few (but expressive) concepts, making it easy to learn and intuitive to use.
New to peewee? These may help:
Defining models is similar to Django or 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)
Connect to the database and create tables:
db.connect()
db.create_tables([User, Tweet])
Create a few rows:
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 (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)
Check out the example twitter app.
Check the documentation 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 on GitHub.
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: