什么是一些好的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')>