Quelles sont les bonnes solutions Python ORM? [fermé]

210

J'évalue et cherche à utiliser CherryPy pour un projet qui est essentiellement un front-end JavaScript du côté client (navigateur) qui parle à un service Web Python sur le back-end. Donc, j'ai vraiment besoin de quelque chose de rapide et léger sur le back-end que je peux implémenter en utilisant Python qui parle ensuite à la base de données PostgreSQL via un ORM (JSON au navigateur).

Je regarde également Django, que j'aime, car son ORM est intégré. Cependant, je pense que Django pourrait être un peu plus que ce dont j'ai vraiment besoin (c'est-à-dire plus de fonctionnalités que je n'en ai vraiment besoin == plus lent?).

Quelqu'un a-t-il une expérience avec différentes solutions Python ORM qui peuvent comparer et contraster leurs caractéristiques et fonctionnalités, leur vitesse, leur efficacité, etc.?

eLuke
la source
ponyORM est plutôt joli.
Niklas R
Le mappage relationnel-objet (ORM) est déjà très populaire dans de nombreux langages de programmation et l'une des meilleures alternatives pour SQL. Je me suis inspiré du style de chaînage des méthodes pour créer du CQL pour mon projet TRIADB. healis.eu/triadb/#latest-release
Athanassios

Réponses:

96

SQLAlchemy est plus complet et puissant (utilise le modèle DataMapper). Django ORM a une syntaxe plus propre et est plus facile à écrire (modèle ActiveRecord). Je ne connais pas les différences de performances.

SQLAlchemy a également une couche déclarative qui cache une certaine complexité et lui donne une syntaxe de style ActiveRecord plus similaire à l'ORM Django.

Je ne m'inquiéterais pas du fait que Django soit "trop ​​lourd". Il est suffisamment découplé pour que vous puissiez utiliser l'ORM si vous le souhaitez sans avoir à importer le reste .

Cela dit, si j'utilisais déjà CherryPy pour la couche Web et que j'avais juste besoin d'un ORM, j'opterais probablement pour SQLAlchemy.

Carl Meyer
la source
7
Mais si vous n'aimez pas l'ORM de Django et que vous souhaitez utiliser SA, par exemple, vous perdez beaucoup de fonctionnalités de django, comme admin. Pas un briseur d'affaire, mais un genou écorché.
Gregg Lind
22
Certes, mais sans rapport avec la question, qui consistait simplement à choisir un ORM Python; pas sur les interfaces d'administration générées automatiquement ou d'autres composants du cadre.
Carl Meyer
8
Je dirais que SQLAlchemy est tout sauf léger - il peut cependant être assez rapide. Je vais lancer mon projet dans le mix, ça s'appelle peewee et ça parle aux postgres. Récemment, la prise en charge des requêtes de style django a également été ajoutée! charlesleifer.com/docs/peewee
coleifer
3
Veuillez également noter que Django ORM ne prend pas en charge les clés primaires composites et SQLAlchemy le prend en charge.
Marcin Kapusta
1
@yegle Je suis confus par votre commentaire. Je ne comprends pas la logique. Comment «difficile de trouver des instructions ORDER BY DESCdans les documents» implique-t-il «mauvais pour le modèle d'enregistrement actif»?
jpmc26
108

Si vous êtes à la recherche de poids léger et 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.

coleifer
la source
pouvez-vous m'aider pour cette question? Pls ru.stackoverflow.com/q/1114189/293323
Cookie
81

Storm a sans doute l'API la plus simple:

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

Et il est indolore de descendre dans le SQL brut lorsque vous devez:

store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', []) 
store.commit()
Patrick
la source
Il convient de noter que Storm ne prend en charge que MySQL et PostgreSQL pour le moment. Le support Oracle est cependant en préparation.
Jason Baker
15
Il prend également en charge SQLite comme le suggère l'exemple ci-dessus
shearichard
2
quick_orm est aussi simple que Storm et il est construit sur SQLAlchemy donc il est également très puissant: pypi.python.org/pypi/quick_orm . Avertissement: je suis l'auteur de quick_orm
Tyler Long
8
La tempête n'est pas entretenue. Je ne l'utiliserais pas pour de nouveaux projets.
Matthias Urlichs
3
En outre, il semble qu'il n'y ait pas de tempête pour Python 3
ygormutti
27

J'utilise habituellement SQLAlchemy . Il est assez puissant et est probablement l'ORM en python le plus mature.

Si vous prévoyez d'utiliser CherryPy, vous pourriez également vous pencher sur dejavu car il est de Robert Brewer (le gars qui est le chef de projet CherryPy actuel). Personnellement, je ne l'ai pas utilisé, mais je connais des gens qui l'aiment.

SQLObject est un peu plus facile à utiliser ORM que SQLAlchemy, mais il n'est pas aussi puissant.

Personnellement, je n'utiliserais pas l'ORM Django à moins que je ne prévoie d'écrire tout le projet dans Django, mais c'est juste moi.

Jason Baker
la source
SQLObject est génial - simple à utiliser, indépendant de la base de données et il peut réellement créer les tables pour vous! (Je suis fainéant).
Lucas Jones
1
@Lucas - SQLAlchemy aussi ...
Jason Baker
Pour autant que je me souvienne, je complimentais généralement SQLObject. C'était il y a longtemps, cependant ... :)
Lucas Jones
@Lucas - Je me figurais comme tel. Je pensais juste en prendre note. :-)
Jason Baker
17

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 de 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()
zzzeek
la source
Mais les choses deviennent très complexes s'il existe de nombreuses relations telles que l'héritage one_to_many, many_to_many, la table. Vous devez écrire beaucoup de code à la main pour les gérer. Vérifiez ma réponse pour Quick ORM. Cela peut vous faire gagner du temps.
Tyler Long
18
:) chez Tyler disant au créateur de SQLAlchemy qu'il devrait utiliser Quick ORM.
Anthony Briggs
5
:) Ça me rappelle quelqu'un il y a des années sur usenet faisant valoir avec dmr @ alice qu'il ne comprenait pas vraiment C.
Peter Rowell
@AnthonyBriggs, consultez cette diapositive et vous comprendrez pourquoi quick_orm est meilleur dans la gestion des relations complexes que SQLAlchemy: slideshare.net/tyler4long/quickorm
Tyler Long
10

Nous utilisons Elixir aux côtés de SQLAlchemy et nous l'avons aimé jusqu'à présent. Elixir place une couche au-dessus de SQLAlchemy qui la fait ressembler davantage aux contre-parties du "modèle ActiveRecord".

airportyh
la source
2
SQLAlchemy prend en charge la POO et les styles fonctionnels prêts à l'emploi, Elixir ajoute un style de programmation déclarative (principalement pour les déclarations de modèle mais peut être étendu) par-dessus.
muhuk
5

Cela semble être le point de référence canonique pour l'interaction de base de données de haut niveau en Python: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

De là, il semble que Dejavu implémente le modèle DataMapper de Martin Fowler de manière assez abstraite en Python.

entropo
la source
J'étais intéressé et j'ai regardé Dejavu. Juste un peu. La documentation est très clairsemée (qoute "pour la couche de présentation vous êtes seul") donc seulement pour les utilisateurs avancés je dirais.
r4.
1

Je pense que vous pourriez regarder:

L'automne

Tempête

Lukas Šalkauskas
la source
L'automne est probablement plus facile que Storm, mais Storm comprend de nombreuses fonctionnalités que Autumn ne propose pas. La documentation de ces deux options est limitée, bien que Storm répare aussi vite!
alecwh
Merci, l'automne a l'air très agréable et attrayant, mais n'a aucune documentation, ce qui est une rupture pour moi.
temoto
1
Je viens d'essayer quelques exemples sur la page d'automne, et ils ne fonctionnent même pas avec la version du code installé par mon gestionnaire de paquets. Les messages du groupe Google sont également anciens. On dirait que le projet est en train de mourir d'une mort lente. Je ne recommanderais pas de l'utiliser.
Jason Miesionczek
Storm, d'autre part, devient rapidement mon ORM de choix. Les documents s'améliorent et l'API est propre et simple, bien que je sois un peu plus habitué au modèle ActiveRecord utilisé par Django ORM, je trouve que Storm est facile à naviguer.
Jason Miesionczek
1
Autum ne semble pas avoir d'activité depuis un an. groups.google.com/group/autumn-orm
Sridhar Ratnakumar
1

Il n'y a aucun moyen concevable que les fonctionnalités inutilisées de Django entraînent une baisse des performances. Pourrait être utile si vous décidez de faire évoluer le projet.

Carl Meyer
la source
8
il y a un moyen incroyable
bukzor
0

J'ai utilisé Storm + SQLite pour un petit projet et j'en ai été très satisfait jusqu'à ce que j'ajoute le multiprocessing. La tentative d'utilisation de la base de données à partir de plusieurs processus a entraîné une exception «La base de données est verrouillée». Je suis passé à SQLAlchemy et le même code a fonctionné sans problème.

Phil Loden
la source
7
Pour être honnête, SQLite n'est pas vraiment conçu pour les accès simultanés.
Xiong Chiamiov
2
@Xion +1. SQLITE est un seul fichier, sans démon en cours d'exécution.
e-satis
-1

SQLAlchemy est très, très puissant. Cependant, il n'est pas sûr pour les threads, assurez-vous de garder cela à l'esprit lorsque vous travaillez avec cherrypy en mode pool de threads.

Anon
la source
2
est-il vrai que SQLAlchemy n'est pas threadsafe? Alors, comment est-il utilisé dans les applications Pyramid sur WSGI, que les gens déploient principalement en mode thread? Toute confirmation de cette déclaration contradictoire.
Ravi Kumar
1
Bien sûr, SQLAlchemy est thread-safe.
Matthias Urlichs
-7

Je vérifierais SQLAlchemy

C'est vraiment facile à utiliser et les modèles avec lesquels vous travaillez ne sont pas mauvais du tout. Django utilise SQLAlchemy pour son ORM mais l'utiliser seul vous permet d'utiliser sa pleine puissance.

Voici un petit exemple sur la création et la sélection d'objets 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')>
Yon
la source
18
Django n'utilise pas sqlalchemy pour son ORM. Certains travaux ont été effectués pour faire de sqlalchemy un ORM facultatif, mais il n'est pas terminé.
sherbang