什么是好的Python ORM解决方案?

2024-04-29 00:13:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

有没有人有过使用不同Python ORM解决方案的经验,这些解决方案可以比较和对比它们的特性和功能、速度、效率等。?


Tags: 项目djangowebjson客户端dbpostgresqlorm
3条回答

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

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

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

我不担心Django“太重”,它已经足够解耦了,如果您想使用ORM,就可以不必导入其余的。

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

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

相关问题 更多 >