好用的 Python ORM 解决方案有那些?

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

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

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

197872 次浏览

我想你可以看看:

秋季

风暴

我会看看SQLAlchemy

它真的很容易使用,你所使用的模型一点也不差。Django对ORM使用SQLAlchemy,但使用它本身让你使用它的全部力量。

下面是一个关于创建和选择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,因为它是由罗伯特布鲁尔(这家伙是当前的CherryPy项目负责人)。我个人没有用过,但我知道有些人喜欢它。

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

就我个人而言,我不会使用Django ORM,除非我打算用Django编写整个项目,但那只是我。

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

Django中未使用的特性不可能带来性能损失。如果你想要升级这个项目,也许就会派上用场。

风暴可以说是最简单的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的all in one接口。它还与使用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时记住这一点。

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

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

由此看来,Dejavu在Python中相当抽象地实现了Martin Fowler的DataMapper模式。

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

例子:

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

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