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+ supports sqlite, mysql, mariadb, postgresql and cockroachdb tons of extensions New to peewee? These may help: Quickstart Example twitter app Using peewee interactively Models and fields Querying Relationships and joins Examples 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 . Learning more 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. Still want more info? 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 .