What are some good Python ORM solutions? [closed]
If you're looking for lightweight and are already familiar with django-style declarative models, check out peewee: https://github.com/coleifer/peewee
Example:
import datetimefrom peewee import *class Blog(Model): name = CharField()class Entry(Model): blog = ForeignKeyField(Blog) title = CharField() body = TextField() pub_date = DateTimeField(default=datetime.datetime.now)# query it like djangoEntry.filter(blog__name='Some great blog')# or programmatically for finer-grained controlEntry.select().join(Blog).where(Blog.name == 'Some awesome blog')
Check the docs for more examples.
SQLAlchemy is more full-featured and powerful (uses the DataMapper pattern). Django ORM has a cleaner syntax and is easier to write for (ActiveRecord pattern). I don't know about performance differences.
SQLAlchemy also has a declarative layer that hides some complexity and gives it a ActiveRecord-style syntax more similar to the Django ORM.
I wouldn't worry about Django being "too heavy." It's decoupled enough that you can use the ORM if you want without having to import the rest.
That said, if I were already using CherryPy for the web layer and just needed an ORM, I'd probably opt for SQLAlchemy.
Storm has arguably the simplest API:
from storm.locals import *class Foo: __storm_table__ = 'foos' id = Int(primary=True)class Thing: __storm_table__ = 'things' id = Int(primary=True) name = Unicode() description = Unicode() foo_id = Int() foo = Reference(foo_id, Foo.id)db = create_database('sqlite:')store = Store(db)foo = Foo()store.add(foo)thing = Thing()thing.foo = foostore.add(thing)store.commit()
And it makes it painless to drop down into raw SQL when you need to:
store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', []) store.commit()