什么是一些好的Python ORM解决scheme?

我正在评估并考虑将CherryPy用于基本上来自客户端(浏览器)的JavaScript前端项目,该项目将与后端的Python Web服务进行对话。 所以,我真的需要在后端使用Python来实现快速和轻量级的function,然后通过ORM(浏览器的JSON)与PostgreSQL数据库进行交stream。

我也在看着我喜欢的Django,因为它的ORM是内置的。 但是,我认为Django可能比我真正需要的多一点(比我更需要更多的function==慢点?)。

任何人都有不同的Python ORM解决scheme的经验,可以比较和对比他们的function,速度,效率等。

SQLAlchemyfunction更强大,function更强大(使用DataMapper模式)。 Django ORM有一个更干净的语法,并且更容易编写(ActiveRecord模式)。 我不知道性能差异。

SQLAlchemy也有一个声明层 ,它隐藏了一些复杂性,并给它一个更类似于Django ORM的ActiveRecord风格的语法。

我不担心Django“太重”了。 它足够分离,您可以使用ORM,而无需导入其余部分。

也就是说,如果我已经在使用CherryPy作为web层,只需要一个ORM,那么我可能会selectSQLAlchemy。

如果你正在寻找轻量级的,并已经熟悉django风格的声明模型,请检查peewee: https : //github.com/coleifer/peewee

例:

 import datetime from 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 django Entry.filter(blog__name='Some great blog') # or programmatically for finer-grained control Entry.select().join(Blog).where(Blog.name == 'Some awesome blog') 

查看文档以获取更多示例。

风暴可以说是最简单的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 = foo store.add(thing) store.commit() 

当你需要的时候,它可以很容易地下载到原始的SQL中:

 store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', []) store.commit() 

我通常使用SQLAlchemy 。 它非常强大,可能是最成熟的Python ORM。

如果你打算使用CherryPy,你也可以考虑一下dejavu,就像现在的CherryPy项目负责人Robert Brewer一样。 我个人并没有使用它,但我知道一些爱它的人。

SQLObject比使用SQLAlchemy更容易使用ORM,但它并不那么强大。

就个人而言,除非我计划在Django中编写整个项目,否则我不会使用Django ORM,但那只是我自己。

SQLAlchemy的声明式扩展(在0.5中成为标准)提供了与Django或Storm类似的全function接口。 它也与使用datamapper风格configuration的类/表无缝集成:

 Base = declarative_base() class Foo(Base): __tablename__ = 'foos' id = Column(Integer, primary_key=True) class Thing(Base): __tablename__ = 'things' id = Column(Integer, primary_key=True) name = Column(Unicode) description = Column(Unicode) foo_id = Column(Integer, ForeignKey('foos.id')) foo = relation(Foo) engine = create_engine('sqlite://') Base.metadata.create_all(engine) # issues DDL to create tables session = sessionmaker(bind=engine)() foo = Foo() session.add(foo) thing = Thing(name='thing1', description='some thing') thing.foo = foo # also adds Thing to session session.commit() 

我们在SQLAlchemy旁边使用Elixir并且迄今为止都喜欢它。 Elixir在SQLAlchemy的顶层放置了一层,使其看起来更像“ActiveRecord模式”计数器部分。

这似乎是Python中高级数据库交互的标准参考点: http : //wiki.python.org/moin/HigherLevelDatabaseProgramming

从那里,看起来Dejavu在Python中非常抽象地实现了Martin Fowler的DataMapper模式。

我想你可能会看:

秋季

风暴

Django中未使用的特性将会导致性能损失,这是无法想象的。 如果您决定升级项目,可能会派上用场。

SQLAlchemy非常非常强大。 但是它不是线程安全的,请确保在线程池模式下使用cherrypy时记住这一点。

我使用Storm + SQLite进行了一个小型项目,直到添加了多处理function之后,才开始使用它。 试图从多个进程使用数据库导致“数据库被locking”exception。 我切换到SQLAlchemy,相同的代码工作没有问题。

我会看看SQLAlchemy

它使用起来非常简单,而且与您一起工作的模型并不差。 Django使用SQLAlchemy来实现它的ORM,但是单独使用它可以让你使用它的全部function。

这里是创build和selectorm对象的一个​​小例子

 >>> ed_user = User('ed', 'Ed Jones', 'edspassword') >>> session.add(ed_user) >>> our_user = session.query(User).filter_by(name='ed').first() >>> our_user <User('ed','Ed Jones', 'edspassword')>