【问题标题】:What are some good Python ORM solutions? [closed]有哪些好的 Python ORM 解决方案? [关闭]
【发布时间】:2010-09-08 09:08:11
【问题描述】:

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

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

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

【问题讨论】:

  • ponyORM 看起来不错。
  • 对象-关系映射 (ORM) 在许多编程语言中已经非常流行,并且是 SQL 的最佳替代方案之一。我从方法链风格中获得灵感,为我的 TRIADB 项目创建 CQL。 healis.eu/triadb/#latest-release

标签: python orm


【解决方案1】:

SQLAlchemy 功能更全面、功能更强大(使用 DataMapper 模式)。 Django ORM 具有更简洁的语法并且更易于编写(ActiveRecord 模式)。我不知道性能差异。

SQLAlchemy 也有一个declarative layer,它隐藏了一些复杂性,并赋予它一个更类似于 Django ORM 的 ActiveRecord 样式语法。

我不会担心 Django “太重”。它已经足够解耦,如果你想要without having to import the rest,你可以使用 ORM。

也就是说,如果我已经将 CherryPy 用于 Web 层并且只需要一个 ORM,我可能会选择 SQLAlchemy。

【讨论】:

  • 但是如果你不喜欢 Django 的 ORM,并且想使用 SA,例如,你会失去很多 django 的特性,比如 admin。不是破坏交易,而是膝盖被剥皮。
  • 是的,但与问题无关,这只是关于选择 Python ORM;与自动生成的管理界面或其他框架组件无关。
  • 我认为 SQLAlchemy 绝不是轻量级的——尽管它可以相当快。我将把我的项目混在一起,它叫做 peewee,它与 postgres 对话。最近也添加了对 django 样式查询的支持! charlesleifer.com/docs/peewee
  • 另请注意,Django ORM 不支持复合主键,而 SQLAlchemy 支持。
  • @yegle 我对你的评论感到困惑。我不明白其中的逻辑。 “在文档中很难找到关于 ORDER BY DESC 的说明”如何暗示“对活动记录模式不利”?
【解决方案2】:

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

【讨论】:

  • 需要注意的是,Storm 目前只支持 MySQL 和 PostgreSQL。不过,Oracle 支持正在进行中。
  • 如上例所示,它也支持 SQLite
  • quick_orm 和 Storm 一样简单,它建立在 SQLAlchemy 之上,所以它也非常强大:pypi.python.org/pypi/quick_orm。免责声明:我是 quick_orm 的作者
  • Storm 未维护。我不会将它用于新项目。
  • 另外,Python 3 似乎没有 Storm
【解决方案3】:

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

【讨论】:

  • Django not 使用 sqlalchemy 作为 ORM。已经做了一些工作来使 sqlalchemy 成为可选的 ORM,但它并不完整。
【解决方案4】:

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

【讨论】:

  • 但是如果有很多关系,比如one_to_many,many_to_many,表继承,事情就会变得非常复杂。您必须手动编写大量代码才能处理它们。检查我对快速 ORM 的回答。它可以节省您的时间。
  • :) 在 Tyler 告诉 SQLAlchemy 的创建者他应该使用 Quick ORM。
  • :) 让我想起了几年前在 usenet 上与 dmr@alice 争论他并不真正理解 C 的人。
  • @AnthonyBriggs,看看这张幻灯片,你就会明白为什么 quick_orm 比 SQLAlchemy 更擅长处理复杂的关系:slideshare.net/tyler4long/quickorm
  • 看起来 quick_orm 已经死了 10 年了...github.com/tylerlong/quick_orm
【解决方案5】:

无法想象 Django 中未使用的功能会降低性能。如果您决定升级项目,可能会派上用场。

【讨论】:

  • 有一个可以理解的方式
【解决方案6】:

如果您正在寻找轻量级并且已经熟悉 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 了解更多示例。

【讨论】:

    【解决方案7】:

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

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

    【讨论】:

    • 我很感兴趣,看了看Dejavu。只有一点。文档非常稀少(qoute “对于你自己的表示层”),所以我只对高级用户说。
    【解决方案8】:

    我在一个小项目中使用了 Storm + SQLite,并且对它非常满意,直到我添加了多处理。尝试从多个进程中使用数据库会导致“数据库已锁定”异常。我切换到 SQLAlchemy,同样的代码没有问题。

    【讨论】:

    • 公平地说,SQLite 并不是真正为并发访问而设计的。
    • @Xion +1。 SQLITE 是唯一的一个文件,没有运行守护进程。
    【解决方案9】:

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

    【讨论】:

    • SQLAlchemy 真的不是线程安全的吗?那么它是如何在 WSGI 上的 Pyramid 应用程序中使用的,主要是人们以线程模式部署的?对这一矛盾陈述的任何确认。
    • 当然 SQLAlchemy 是线程安全的。
    【解决方案10】:

    我们将Elixir 与 SQLAlchemy 一起使用,并且到目前为止很喜欢它。 Elixir 在 SQLAlchemy 之上放置了一个层,使其看起来更像“ActiveRecord 模式”计数器部件。

    【讨论】:

    • SQLAlchemy 支持 OOP 和开箱即用的函数样式,Elixir 在其之上添加了声明式编程样式(主要用于模型声明,但可以扩展)。
    【解决方案11】:

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

    如果您打算使用 CherryPy,您还可以查看 dejavu,因为它是由 Robert Brewer(现任 CherryPy 项目负责人)撰写的。我个人没有使用过它,但我知道有些人喜欢它。

    SQLObject 使用 ORM 比使用 SQLAlchemy 稍微容易一些,但功能却没有那么强大。

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

    【讨论】:

    • SQLObject 很棒 - 易于使用,独立于数据库,它实际上可以为您制作表格! (我很懒)。
    • @Lucas - SQLAlchemy 也可以...
    • 据我所记得,我只是普遍地称赞 SQLObject。不过那是很久以前的事了……:)
    • @Lucas - 我是这么认为的。只是想我会记下它。 :-)
    【解决方案12】:

    我想你可能会看:

    Autumn

    Storm

    【讨论】:

    • Autumn 可能比 Storm 更容易,但 Storm 包含了许多 Autumn 没有的功能。这两个选项的文档都很有限,尽管 Storm 正在快速修复!
    • 谢谢,Autumn 看起来非常漂亮和有吸引力,但文档为零,这对我来说是一个交易破坏者。
    • 我刚刚尝试了秋季页面上的一些示例,它们甚至不适用于我的包管理器安装的代码版本。 google 群里的帖子也老了。看起来这个项目正在慢慢消亡。不推荐使用它。
    • Storm 正迅速成为我的首选 ORM。文档越来越好,API 简洁明了,虽然我更习惯 Django ORM 使用的 ActiveRecord 模式,但我发现 Storm 易于导航。
    • Autum 一年来似乎没有任何活动。 groups.google.com/group/autumn-orm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多