什么是一些优秀的Python ORM解决方案?

时间:2008-09-10 04:49:33

标签: python orm

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

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

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

12 个答案:

答案 0 :(得分:100)

如果您正在寻找轻量级并且已经熟悉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')

查看docs了解更多示例。

答案 1 :(得分:87)

SQLAlchemy功能更强大,功能更强大(使用DataMapper模式)。 Django ORM具有更清晰的语法,更易于编写(ActiveRecord模式)。我不知道性能差异。

SQLAlchemy还有一个declarative layer隐藏了一些复杂性,并为它提供了一个更类似于Django ORM的ActiveRecord风格的语法。

我不担心Django“太重了”。它已经解耦,你可以使用ORM,而不必导入其余的东西。

那就是说,如果我已经将CherryPy用于网络层而只需要一个ORM,我可能会选择SQLAlchemy。

答案 2 :(得分:79)

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

答案 3 :(得分:27)

我通常使用SQLAlchemy。它非常强大,可能是最成熟的python ORM。

如果你打算使用CherryPy,你也可以查看dejavu,因为它是Robert Brewer(当前CherryPy项目负责人)。我个人没有用它,但我确实知道有些人喜欢它。

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

就个人而言,除非我计划在Django中编写整个项目,否则我不会使用Django ORM,但那只是我。

答案 4 :(得分:17)

SQLAlchemy的declarative扩展,在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()

答案 5 :(得分:9)

我们在SQLAlchemy旁边使用Elixir并且到目前为止一直喜欢它。 Elixir在SQLAlchemy上放置一层,使其看起来更像“ActiveRecord模式”计数器部分。

答案 6 :(得分:4)

这似乎是Python中高级数据库交互的规范参考点: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

从那里开始,看起来Dejavu在Python中相当抽象地实现了Martin Fowler的DataMapper模式。

答案 7 :(得分:1)

我想你可能会看一下:

Autumn

Storm

答案 8 :(得分:1)

Django中未使用的功能无法实现性能损失。如果您决定升级该项目,可能会派上用场。

答案 9 :(得分:0)

SQLAlchemy非常强大。但是,它不是线程安全的,确保在线程池模式下使用cherrypy时要记住这一点。

答案 10 :(得分:0)

我将Storm + SQLite用于一个小项目,并且在我添加多处理之前对它非常满意。尝试使用来自多个进程的数据库导致“数据库被锁定”异常。我切换到SQLAlchemy,相同的代码没有问题。

答案 11 :(得分:-7)

我会查看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')>