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

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

What are some good Python ORM solutions?

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

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

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


如果您正在寻找轻量级并且已经熟悉django风格的声明模型,请查看peewee:
https://github.com/coleifer/peewee

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  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:

1
2
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样式配置的类/表无缝集成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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模式"计数器部分。


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

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


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


我想你可能会看一下:

秋季

风暴


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


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


我查看SQLAlchemy

它非常易于使用,与您合作的模型也不错。 Django使用SQLAlchemy作为它的ORM ,但是单独使用它可以让你使用它的全部功能。

这是一个关于创建和选择orm对象的小例子

1
2
3
4
5
>>> 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')>


推荐阅读

    linux安装浏览器命令?

    linux安装浏览器命令?,官网,系统,平台,网站,管理,设备,咨询,工具,官方网站,

    linux命令测试客户端?

    linux命令测试客户端?,地址,系统,网络,工具,工作,分析,环境,命令,下行,资料,l

    linux命令创建项目组?

    linux命令创建项目组?,管理,密码,项目,命令,系统,位置,文件,用户组,用户,文

    复制项目的linux命令?

    复制项目的linux命令?,系统,项目,文件,命令,目录,源文件,语法,选项,目标,功

    linux启动浏览器命令?

    linux启动浏览器命令?,系统,情况,发行,不了,官网,环境,工具,传播,基础,软件,

    linux命令项目部署?

    linux命令项目部署?,项目,服务,环境,软件,系统,代理,管理,统一,做好,业务,怎

    linux默认浏览器命令?

    linux默认浏览器命令?,环境,系统,发行,工程,工具,浏览器,软件,情况,网站,管

    linux部署项目的命令?

    linux部署项目的命令?,项目,系统,设备,环境,工作,基础,传播,信息,标准,代码,L

    linux命令下载浏览器?

    linux命令下载浏览器?,软件,系统,官网,网站,工具,名称,中心,密码,时间,设计,l

    linux项目常用命令?

    linux项目常用命令?,工作,地址,系统,信息,管理,项目,命令,目录,标准,网络,lin

    linux项目更新命令?

    linux项目更新命令?,系统,信息,网络,地址,网站,通信,管理,时间,项目,命令,lin

    启动项目命令linux?

    启动项目命令linux?,工作,经理,产品,技术,地址,数字,系统,项目,命令,信息,怎

    linux命令关浏览器?

    linux命令关浏览器?,系统,工作,工具,咨询,信息,平台,官方网站,管理,数据,电

    linux编译项目的命令?

    linux编译项目的命令?,系统,工作,地址,软件,工具,信息,代码,项目,命令,环境,l

    安卓linux命令客户端?

    安卓linux命令客户端?,系统,软件,名字,设备,互动,服务,工具,基础,发展,代码,a

    项目linux常用命令?

    项目linux常用命令?,工作,地址,系统,管理,设备,信息,项目,命令,目录,标准,lin

    安装客户端linux命令?

    安装客户端linux命令?,软件,中心,在线,发行,全国,公司,工作,国家,信息,命令,

    linux上部署项目命令?

    linux上部署项目命令?,项目,软件,服务,工具,环境,代理,地址,代码,首页,做好,l

    linux创建项目命令?

    linux创建项目命令?,名称,新增,项目,文件,命令,首次,工作,时间,文件夹,文件

    linux客户端连接命令?

    linux客户端连接命令?,系统,地址,服务,工具,位置,基础知识,网络,工作,基础,