255 votes

Quelles sont les bonnes solutions Python ORM?

Je suis de l'évaluation et de la recherche à l'aide de CherryPy pour un projet, c'est essentiellement un javascript front-end du côté client (navigateur) qui parle d'un Python de service web sur le back-end. Alors, j'ai vraiment besoin de quelque chose de rapide et léger sur le back-end que je puisse les mettre en œuvre à l'aide de Python qui parle ensuite de le PostgreSQL base de données via un ORM (JSON pour le navigateur).

Je suis également à la recherche de Django, que j'aime, depuis sa ORM est intégré. Cependant, je pense que Django peut-être un peu plus que j'ai vraiment besoin (c'est à dire plus de fonctionnalités que j'ai vraiment besoin d' == plus lent?).

Quelqu'un a une expérience avec les différentes Python ORM solutions qui peuvent comparer leurs caractéristiques et de fonctionnalités, rapidité, efficacité, etc.?

138voto

coleifer Points 2443

Si vous cherchez un modèle léger et que vous connaissez déjà les modèles déclaratifs de style django, consultez peewee: https://github.com/coleifer/peewee

Exemple:

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

Consultez les documents pour plus d'exemples.

134voto

Carl Meyer Points 30736

SQLAlchemy est plus complet et puissant qui utilise le DataMapper modèle). L'ORM de Django a un nettoyeur de syntaxe et est plus facile à écrire pour (ActiveRecord modèle). Je ne connais pas les différences de rendement.

SQLAlchemy a aussi un déclarative couche qui cache une certaine complexité et lui donne un ActiveRecord-la syntaxe de style de plus en plus semblables à l'ORM de Django.

Je ne serais pas s'inquiéter à propos de Django "trop lourd". C'est découplé assez que vous pouvez utiliser l'ORM si vous le souhaitez, sans avoir à importer le reste.

Cela dit, si j'étais déjà à l'aide de CherryPy pour le web la couche et juste besoin d'un ORM, je serais probablement opter pour SQLAlchemy.

29voto

Jason Baker Points 56682

J'ai l'habitude d'utiliser SQLAlchemy. Il est assez puissant et sans doute le plus mature python ORM.

Si vous prévoyez sur l'utilisation de CherryPy, vous pouvez également regarder dans dejavu que c'est par Robert Brasseur (le gars qui est l'actuel CherryPy chef de projet). Personnellement, je ne l'ai pas utilisé, mais je sais que certaines personnes qu'il aime.

SQLObject est un peu plus facile à utiliser l'ORM de SQLAlchemy, mais ce n'est pas tout à fait aussi puissant.

Personnellement, je ne voudrais pas utiliser l'ORM de Django, à moins que je comptais sur l'écriture de l'ensemble du projet dans Django, mais c'est juste moi.

17voto

zzzeek Points 22617

L'extension déclarative de SQLAlchemy, qui devient standard en 0.5, fournit une interface tout en un très similaire à celle de Django ou Storm. Il s'intègre également de manière transparente aux classes / tables configurées à l'aide du style 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()
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X