有什么好的Python ORM解决方案?
我正在评估并考虑将CherryPy用于一个项目,该项目基本上是客户端(浏览器)的JavaScript前端,可与后端的Python Web服务对话。因此,我确实需要在后端实现快速,轻便的东西,我可以使用Python来实现,然后再通过ORM(浏览器的JSON)与PostgreSQL DB对话。
我还在看我喜欢的Django,因为它的ORM是内置的。但是,我认为Django可能比我真正需要的更多(即比我真正需要的功能更多==慢吗?)。
任何人都具有使用不同Python ORM解决方案的经验,这些解决方案可以比较和对比其特性和功能,速度,效率等?
解决方案
回答
我认为我们可能会看一下:
秋天
风暴
回答
我会检查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。
回答
我通常使用SQLAlchemy。它非常强大,并且可能是最成熟的python ORM。
如果我们打算使用CherryPy,我们可能还会研究dejavu,就像Robert Brewer(现任CherryPy项目负责人)一样。我个人没有使用过它,但我确实知道有些人喜欢它。
SQLObject使用ORM比使用SQLAlchemy容易一些,但功能不那么强大。
就个人而言,除非计划在Django中编写整个项目,否则我不会使用Django ORM,但这只是我一个人。
回答
我们将Elixir与SQLAlchemy结合使用,到目前为止,它还是很喜欢的。 Elixir在SQLAlchemy之上放置了一层,使其看起来更像" ActiveRecord模式"计数器部分。
回答
Django的未使用功能不会给性能带来任何损失,这是无法想象的。如果我们决定扩大项目规模,则可能会派上用场。
回答
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的声明性扩展已在0.5中成为标准,它提供了一个与Django或者Storm十分相似的多合一接口。它还与使用datamapper样式配置的类/表无缝集成:
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非常非常强大。但是,它不是线程安全的,请确保在线程池模式下使用cherrypy时要牢记这一点。