我正在评估并考虑将CherryPy用于一个项目,该项目基本上是一个从客户端(浏览器)到后端与Python web服务对话的JavaScript前端。所以,我真的需要一些快速和轻量级的在后端,我可以使用Python实现,然后通过ORM (JSON到浏览器)与PostgreSQL DB对话。

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

谁有使用不同的Python ORM解决方案的经验,可以比较和对比它们的特性和功能、速度、效率等?


当前回答

我在一个小项目中使用了Storm + SQLite,在添加多处理之前,我对它非常满意。试图从多个进程使用数据库会导致“数据库被锁定”异常。我切换到SQLAlchemy,同样的代码工作起来没有任何问题。

其他回答

Storm拥有最简单的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

它真的很容易使用,你所使用的模型一点也不差。Django使用SQLAlchemy作为ORM,但是单独使用它可以让你充分利用它的功能。

下面是一个关于创建和选择orm对象的小例子

>>> 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')>

SQLAlchemy功能更全,功能更强大(使用DataMapper模式)。Django ORM的语法更简洁,也更容易编写(ActiveRecord模式)。我不知道表现上的差异。

SQLAlchemy还有一个声明性层,隐藏了一些复杂性,并提供了一个更类似于Django ORM的activerecord风格的语法。

我不担心Django“太重”。它已经充分解耦,如果您愿意,可以使用ORM,而不必导入其余部分。

也就是说,如果我已经在web层使用CherryPy,并且只是需要一个ORM,我可能会选择SQLAlchemy。

到目前为止,我们将Elixir与SQLAlchemy一起使用。Elixir在SQLAlchemy上添加了一个层,使其看起来更像“ActiveRecord模式”的计数器部分。