Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪些是好的Python ORM解决方案?_Python_Orm - Fatal编程技术网

哪些是好的Python ORM解决方案?

哪些是好的Python ORM解决方案?,python,orm,Python,Orm,我正在评估并考虑将CherryPy用于一个项目,该项目基本上是客户端(浏览器)的JavaScript前端,与后端的Python web服务进行对话。因此,我真的需要在后端实现一些快速、轻量级的东西,我可以使用Python实现这些东西,然后通过ORM(JSON到浏览器)与PostgreSQL数据库通信 我也在看Django,我喜欢它,因为它的ORM是内置的。然而,我认为Django可能比我真正需要的多一点(即比我真正需要的更多特性==更慢?) 任何人都有使用不同Python ORM解决方案的经验,

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

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


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

我想您可以看看:

我想退房

它真的很容易使用,而且您使用的模型一点也不差。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')>
>>ed\u user=user('ed','ed Jones','edspassword')
>>>会话.添加(ed_用户)
>>>我们的用户=session.query(user).filter\u by(name='ed').first()
>>>我们的用户

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

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

我不担心Django会“太重”,它已经足够解耦了,如果您愿意,可以使用ORM

也就是说,如果我已经在web层使用CherryPy并且只需要一个ORM,我可能会选择SQLAlchemy。它非常强大,可能是最成熟的python ORM

如果你打算使用CherryPy,你也可以看看Robert Brewer(现任CherryPy项目负责人)的作品。我个人没有用过,但我知道有些人喜欢它

与SQLAlchemy相比,ORM更易于使用,但它的功能并没有SQLAlchemy强大


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

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

Django中未使用的功能不会对性能造成影响。如果您决定升级项目,可能会派上用场。

可以说是最简单的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()
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()

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

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

这似乎是Python中高级数据库交互的规范参考点:


从这里看,它似乎在Python中相当抽象地实现了Martin Fowler的DataMapper模式。

如果您正在寻找轻量级并且已经熟悉django风格的声明性模型,请查看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')

查看更多示例。

Django的ORM不使用sqlalchemy。为了使sqlalchemy成为可选的ORM,已经做了一些工作,但还没有完成。sqlalchemy支持OOP和开箱即用的函数样式,Elixir在其上添加了声明性编程样式(主要用于模型声明,但可以扩展)。但是如果您不喜欢Django的ORM,并且想使用SA,例如,你会失去很多django的功能,比如admin。不是一个交易破坏者,而是一个剥皮的膝盖。没错,但与问题无关,问题只是选择一个Python ORM;不是关于自动生成的管理接口或其他框架组件。我认为SQLAlchemy绝不是轻量级的——尽管它可以非常快。我将把我的项目放在一起,它叫peewee,它与博士后对话。最近刚刚添加了对django风格查询的支持!还请注意,Django ORM不支持复合主键,SQLAlchemy也支持它。@yegle你的评论把我搞糊涂了。我不懂逻辑。文档中的“难以找到关于订单的说明”如何暗示“不利于活动记录模式”?秋季可能比暴风雪容易,但暴风雪包含许多秋季没有的功能。这两个选项的文档都很有限,不过Storm的修复速度很快!谢谢,秋天看起来非常漂亮,但是没有文档,这对我来说是一个破坏者。我只是在秋天的页面上尝试了一些例子,它们甚至不适用于我的包管理器安装的代码版本。谷歌集团的帖子也很旧。看起来这个项目正在慢慢消亡。不推荐使用。另一方面,Storm正迅速成为我的首选。文档越来越好,API也越来越简洁,虽然我对Django ORM使用的ActiveRecord模式有点习惯,但我发现Storm很容易导航。Autum似乎一年没有任何活动了。需要注意的是,Storm目前只支持MySQL和PostgreSQL。不过,Oracle支持正在进行中。它还支持SQLit