我正在评估并考虑使用CherryPy进行一个项目,该项目基本上是来自客户端(浏览器)的JavaScript前端,后端与后端的Python Web服务对话.所以,我真的需要在后端快速轻量级的东西,我可以用Python实现,然后通过ORM(浏览器的JSON)与PostgreSQL DB对话.
我也在看Django,我喜欢它,因为它的ORM是内置的.但是,我认为Django可能比我真正需要的多一点(比我真正需要的功能更多= =慢?).
任何人都有使用不同Python ORM解决方案的经验,可以比较和对比他们的特性和功能,速度,效率等?
如果您正在寻找轻量级并且已经熟悉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')
查看文档以获取更多示例.
SQLAlchemy功能更强大,功能更强大(使用DataMapper模式).Django ORM具有更清晰的语法,更易于编写(ActiveRecord模式).我不知道性能差异.
SQLAlchemy还有一个声明层,它隐藏了一些复杂性,并为它提供了一个类似于Django ORM的ActiveRecord样式语法.
我不担心Django"太重了".它已经足够分离,你可以使用ORM,而不必导入其余的东西.
也就是说,如果我已经将CherryPy用于Web层并且只需要一个ORM,我可能会选择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.它非常强大,可能是最成熟的python ORM.
如果你打算使用CherryPy,你也可以看看dejavu,因为它是Robert Brewer(当前CherryPy项目负责人).我个人没有用它,但我确实知道有些人喜欢它.
SQLObject比SQLAlchemy更容易使用ORM,但它不是那么强大.
就个人而言,除非我计划在Django中编写整个项目,否则我不会使用Django ORM,但那只是我.
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()
我们使用Elixir和SQLAlchemy,并且到目前为止一直喜欢它.Elixir在SQLAlchemy上放置了一个层,使其看起来更像是"ActiveRecord模式"计数器部分.