有什么好的Python ORM解决方案?[关闭]


209

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

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

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


ponyORM看起来非常不错。
Niklas R

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

Answers:


96

SQLAlchemy功能更强大,功能更强大(使用DataMapper模式)。Django ORM的语法更简洁,更易于编写(ActiveRecord模式)。我不了解性能差异。

SQLAlchemy还具有一个声明性层,该隐藏了一些复杂性,并使其具有类似于Django ORM的ActiveRecord样式语法。

我不会担心Django太“笨重”。它已经足够解耦,因此您可以在不需要导入其余部分的情况下使用ORM 。

就是说,如果我已经在Web层上使用CherryPy并且只需要一个ORM,那么我可能会选择SQLAlchemy。


7
但是,例如,如果您不喜欢Django的ORM,并且想使用SA,则会失去很多django的功能,例如admin。不是交易破坏者,而是膝盖皮肤。
Gregg Lind)

22
是的,但与这个问题无关,这仅仅是选择Python ORM。与自动生成的管理界面或其他框架组件无关。
卡尔·迈尔

8
我会说SQLAlchemy并不是轻量级的东西,尽管它可能很快。我将我的项目混合在一起,这个项目叫做peewee,它与postgres对话。最近刚刚添加了对Django样式查询的支持! charlesleifer.com/docs/peewee
coleifer 2011年

3
另请注意,Django ORM不支持复合主键,而SQLAlchemy支持它。
Marcin Kapusta 2013年

1
@yegle,我对您的评论感到困惑。我不明白逻辑。“很难ORDER BY DESC在文档中找到说明”如何暗示“对活动记录模式不利”?
jpmc26 2014年

108

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

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


您能帮我解决这个问题吗?请ru.stackoverflow.com/q/1114189/293323
Cookie

81

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支持正在进行中。
杰森·贝克

15
如上面的示例所示,它还支持SQLite
shearichard 2010年

2
quick_orm和Storm一样简单,它基于SQLAlchemy构建,因此它也非常强大:pypi.python.org/pypi/quick_orm。免责声明:我是quick_orm的作者
Tyler Long

8
风暴无法维持。我不会在新项目中使用它。
Matthias Urlichs 2014年

3
此外,似乎没有针对Python 3的风暴
ygormutti 2014年

27

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

如果您打算使用CherryPy,您可能还会研究dejavu,就像Robert Brewer(现任CherryPy项目负责人)一样。我个人没有使用过它,但是我确实知道有些人喜欢它。

SQLObject使用ORM比使用SQLAlchemy容易一些,但是功能不那么强大。

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


SQLObject很棒-简单易用,独立于数据库,它实际上可以为您创建表!(我很懒)。
Lucas Jones

1
@Lucas-SQLAlchemy也可以...
Jason Baker,2010年

据我所记得,我只是对SQLObject的称赞。不过,那是很久以前的... :)
卢卡斯·琼斯

@Lucas-我想是这样。只是以为我会记下它。:-)
杰森·贝克

17

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

但是,如果存在许多关系,例如one_to_many,many_to_many,表继承,事情就会变得非常复杂。您必须手工编写许多代码才能处理它们。检查我的答案以了解快速ORM。这样可以节省您的时间。
泰勒·朗

18
:)在Tyler告诉SQLAlchemy的创建者他应该使用Quick ORM。
安东尼·布里格斯

5
:)让我想起了几年前在Usenet上与dmr @ alice争论的某人,他并不真正理解C。–
Peter Rowell

@AnthonyBriggs,查看此幻灯片,您将看到为什么quick_orm比SQLAlchemy更好地处理复杂的关系:slideshare.net/tyler4long/quickorm
Tyler Long

10

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


2
SQLAlchemy开箱即用地支持OOP和功能样式,Elixir在其之上添加了声明式编程样式(主要用于模型声明,但可以扩展)。
muhuk

5

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

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


我很感兴趣,看着Dejavu。只有一点。文档非常稀疏(“对于表示层是您自己的”),所以我只想告诉高级用户。
r4。

1

我认为您可能会看一下:

秋季

风暴


秋天可能比Storm更容易,但是Storm包含了秋天不具备的许多功能。这两个选项的文档都很有限,尽管Storm很快就解决了!
alecwh,2009年

谢谢,Autumn看起来非常漂亮且有吸引力,但是文档为零,这对我来说是个大难题。
temoto

1
我只是在“秋季”页面上尝试了一些示例,它们甚至无法与我的包管理器安装的代码版本一起使用。Google群组中的帖子也很旧。看起来该项目快要死了。不建议使用它。
杰森·米森西奇克

另一方面,Storm迅速成为我的ORM选择。文档变得越来越好,API简洁明了,尽管我更习惯于Django ORM所采用的ActiveRecord模式,但我发现Storm易于浏览。
詹森·米森西奇克

1
Autum似乎一年没有任何活动。groups.google.com/group/autumn-orm
Sridhar Ratnakumar,2010年

1

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


8
有一种可以想象的方式
bukzor

0

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


7
公平地说,SQLite并不是真正为并发访问而设计的。
熊恰亚诺夫,2011年

2
@Xion +1。SQLITE只是一个文件,没有守护程序在运行。
e-satis

-1

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


2
SQLAlchemy不是线程安全的吗?然后,如何在主要通过线程模式部署的WSGI上的Pyramid应用程序中使用它?对这一矛盾说法的任何确认。
拉维·库玛

1
当然,SQLAlchemy是线程安全的。
Matthias Urlichs 2014年

-7

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

18
Django 的ORM 使用sqlalchemy。为了使sqlalchemy成为可选的ORM,已经做了一些工作,但是还不完整。
sherbang
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.