Was sind einige gute Python ORM-Lösungen? [geschlossen]

209

Ich evaluiere und verwende CherryPy für ein Projekt, bei dem es sich im Grunde um ein JavaScript-Frontend auf der Clientseite (Browser) handelt, das mit einem Python-Webdienst im Backend kommuniziert. Ich brauche also wirklich etwas schnelles und leichtes im Back-End, das ich mit Python implementieren kann und das dann über einen ORM (JSON zum Browser) mit der PostgreSQL-Datenbank spricht.

Ich schaue mir auch Django an, das mir gefällt, da sein ORM eingebaut ist. Ich denke jedoch, dass Django etwas mehr sein könnte, als ich wirklich brauche (dh mehr Funktionen, als ich wirklich brauche == langsamer?).

Hat jemand Erfahrung mit verschiedenen Python ORM-Lösungen, die ihre Merkmale und Funktionen, Geschwindigkeit, Effizienz usw. vergleichen und gegenüberstellen können?

eLuke
quelle
ponyORM sieht ziemlich gut aus.
Niklas R
Object-Relational Mapping (ORM) ist in vielen Programmiersprachen bereits sehr beliebt und eine der besten Alternativen für SQL. Ich wurde vom Methodenverkettungsstil inspiriert, um CQL für mein TRIADB-Projekt zu erstellen. healis.eu/triadb/#latest-release
Athanassios

Antworten:

96

SQLAlchemy ist umfassender und leistungsfähiger (verwendet das DataMapper-Muster). Django ORM hat eine sauberere Syntax und ist einfacher zu schreiben (ActiveRecord-Muster). Ich weiß nichts über Leistungsunterschiede.

SQLAlchemy verfügt auch über eine deklarative Ebene , die eine gewisse Komplexität verbirgt und eine Syntax im ActiveRecord-Stil bietet, die dem Django-ORM ähnlicher ist.

Ich würde mir keine Sorgen machen, dass Django "zu schwer" ist. Es ist so entkoppelt, dass Sie das ORM verwenden können, wenn Sie möchten, ohne den Rest importieren zu müssen .

Das heißt, wenn ich CherryPy bereits für die Webebene verwenden würde und nur ein ORM benötige, würde ich mich wahrscheinlich für SQLAlchemy entscheiden.

Carl Meyer
quelle
7
Wenn Sie jedoch Djangos ORM nicht mögen und beispielsweise SA verwenden möchten, verlieren Sie viele Funktionen von Django, z. B. admin. Kein Deal Breaker, sondern ein enthäutetes Knie.
Gregg Lind
22
Richtig, aber irrelevant für die Frage, bei der es einfach um die Auswahl eines Python-ORM ging. nicht über automatisch generierte Admin-Schnittstellen oder andere Framework-Komponenten.
Carl Meyer
8
Ich würde argumentieren, dass SQLAlchemy alles andere als leicht ist - es kann jedoch ziemlich schnell sein. Ich werde mein Projekt in die Mischung werfen, es heißt Peewee und es spricht mit Postgres. Erst kürzlich wurde auch die Unterstützung für Abfragen im Django-Stil hinzugefügt! charlesleifer.com/docs/peewee
Coleifer
3
Bitte beachten Sie auch, dass Django ORM die zusammengesetzten Primärschlüssel nicht unterstützt und SQLAlchemy sie nicht unterstützt.
Marcin Kapusta
1
@yegle Ich bin verwirrt von Ihrem Kommentar. Ich verstehe die Logik nicht. Wie bedeutet "schwer zu findende Anweisungen ORDER BY DESCin den Dokumenten" "schlecht für aktives Aufzeichnungsmuster"?
jpmc26
108

Wenn Sie auf der Suche nach Leichtgewicht sind und bereits mit deklarativen Modellen im Django-Stil vertraut sind, besuchen Sie peewee: https://github.com/coleifer/peewee

Beispiel:

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

Weitere Beispiele finden Sie in den Dokumenten .

Coleifer
quelle
Kannst du mir bei dieser Frage helfen? Pls ru.stackoverflow.com/q/1114189/293323
Plätzchen
81

Storm hat wohl die einfachste 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()

Und es macht es schmerzlos, in Raw SQL zu wechseln, wenn Sie Folgendes benötigen:

store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', []) 
store.commit()
Patrick
quelle
Es ist zu beachten, dass Storm derzeit nur MySQL und PostgreSQL unterstützt. Oracle-Support ist jedoch in Arbeit.
Jason Baker
15
Es unterstützt auch SQLite, wie das obige Beispiel nahe legt
Shearichard
2
quick_orm ist so einfach wie Storm und basiert auf SQLAlchemy. Daher ist es auch sehr leistungsfähig: pypi.python.org/pypi/quick_orm . Haftungsausschluss: Ich bin der Autor von quick_orm
Tyler Long
8
Sturm ist nicht gepflegt. Ich würde es nicht für neue Projekte verwenden.
Matthias Urlichs
3
Es scheint auch, dass es keinen Sturm für Python 3 gibt
ygormutti
27

Normalerweise benutze ich SQLAlchemy . Es ist ziemlich mächtig und wahrscheinlich das ausgereifteste Python-ORM.

Wenn Sie CherryPy verwenden möchten, können Sie sich auch mit Dejavu befassen, da es von Robert Brewer (dem aktuellen CherryPy-Projektleiter) stammt. Ich persönlich habe es nicht benutzt, aber ich kenne einige Leute, die es lieben.

SQLObject ist ein bisschen einfacher zu verwenden als SQLAlchemy, aber es ist nicht ganz so leistungsfähig.

Persönlich würde ich das Django ORM nicht verwenden, wenn ich nicht vorhabe, das gesamte Projekt in Django zu schreiben, aber das bin nur ich.

Jason Baker
quelle
SQLObject ist großartig - einfach zu bedienen, datenbankunabhängig und kann tatsächlich die Tabellen für Sie erstellen! (Ich bin faul).
Lucas Jones
1
@ Lucas - So kann SQLAlchemy ...
Jason Baker
Soweit ich mich erinnern kann, habe ich SQLObject nur allgemein gelobt. Es ist allerdings schon lange her ... :)
Lucas Jones
@ Lucas - ich dachte als solche. Ich dachte nur, ich würde es mir notieren. :-)
Jason Baker
17

Die deklarative Erweiterung von SQLAlchemy , die in 0.5 zum Standard wird, bietet eine All-in-One-Schnittstelle, die der von Django oder Storm sehr ähnlich ist. Es lässt sich auch nahtlos in Klassen / Tabellen integrieren, die im Datamapper-Stil konfiguriert wurden:

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
quelle
Aber die Dinge werden sehr komplex, wenn es viele Beziehungen gibt, wie z. B. one_to_many, many_to_many, Tabellenvererbung. Sie müssen viel Code von Hand schreiben, um damit umgehen zu können. Überprüfen Sie meine Antwort für Quick ORM. Es kann Ihre Zeit sparen.
Tyler Long
18
:) bei Tyler, der dem Schöpfer von SQLAlchemy sagt, dass er Quick ORM verwenden soll.
Anthony Briggs
5
:) Erinnert mich an jemanden vor Jahren im Usenet, der mit dmr @ alice argumentiert, dass er C. nicht wirklich verstanden hat.
Peter Rowell
@AnthonyBriggs, überprüfen Sie diese Folie und Sie werden sehen, warum quick_orm besser mit komplexen Beziehungen umgehen kann
Tyler Long
10

Wir verwenden Elixir neben SQLAlchemy und haben es bisher gemocht. Elixir legt eine Ebene auf SQLAlchemy, die es eher wie die Gegenstücke des "ActiveRecord-Musters" aussehen lässt.

Airportyh
quelle
2
SQLAlchemy unterstützt standardmäßig OOP- und Funktionsstile. Elixir fügt darüber hinaus einen deklarativen Programmierstil hinzu (hauptsächlich für Modelldeklarationen, kann aber erweitert werden).
Muhuk
5

Dies scheint der kanonische Bezugspunkt für die Datenbankinteraktion auf hoher Ebene in Python zu sein: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

Von dort aus sieht es so aus, als würde Dejavu das DataMapper-Muster von Martin Fowler ziemlich abstrakt in Python implementieren.

entropo
quelle
Ich war interessiert und sah Dejavu an. Nur ein bisschen. Die Dokumentation ist sehr spärlich (qoute "für die Präsentationsschicht, die Sie alleine sind"), daher würde ich nur für fortgeschrittene Benutzer sagen.
r4.
1

Ich denke, Sie könnten sich Folgendes ansehen:

Herbst

Sturm

Lukas Šalkauskas
quelle
Der Herbst ist wahrscheinlich einfacher als Storm, aber Storm enthält viele Funktionen, die Autumn nicht bietet. Beide Optionen haben eine begrenzte Dokumentation, obwohl Storm dies so schnell behebt!
Alecwh
Vielen Dank, Autumn sieht sehr schön und attraktiv aus, hat aber keine Dokumentation, was für mich ein Deal Breaker ist.
Temoto
1
Ich habe gerade einige Beispiele auf der Herbstseite ausprobiert und sie funktionieren nicht einmal mit der Version des Codes, den mein Paketmanager installiert hat. Die Beiträge in der Google-Gruppe sind ebenfalls alt. Sieht so aus, als würde das Projekt einen langsamen Tod erleiden. Würde es nicht empfehlen.
Jason Miesionczek
Storm hingegen wird schnell zu meinem bevorzugten ORM. Die Dokumente werden immer besser und die API ist sauber und einfach, obwohl ich ein bisschen mehr an das ActiveRecord-Muster gewöhnt bin, das vom Django ORM verwendet wird. Ich finde, dass Storm einfach zu navigieren ist.
Jason Miesionczek
1
Autum scheint seit einem Jahr keine Aktivität mehr zu haben. groups.google.com/group/autumn-orm
Sridhar Ratnakumar
1

Es ist nicht vorstellbar, dass die nicht verwendeten Funktionen in Django zu Leistungseinbußen führen. Könnte sich als nützlich erweisen, wenn Sie sich jemals dazu entschließen, das Projekt zu verbessern.

Carl Meyer
quelle
8
Es gibt einen verständlichen Weg
Bukzor
0

Ich habe Storm + SQLite für ein kleines Projekt verwendet und war ziemlich zufrieden damit, bis ich Multiprocessing hinzugefügt habe. Der Versuch, die Datenbank aus mehreren Prozessen heraus zu verwenden, führte zu einer Ausnahme "Datenbank ist gesperrt". Ich wechselte zu SQLAlchemy und der gleiche Code funktionierte ohne Probleme.

Phil Loden
quelle
7
Um fair zu sein, ist SQLite nicht wirklich für gleichzeitige Zugriffe ausgelegt.
Xiong Chiamiov
2
@Xion +1. SQLITE ist eine einzige Datei, auf der kein Daemon ausgeführt wird.
E-Satis
-1

SQLAlchemy ist sehr, sehr mächtig. Es ist jedoch nicht threadsicher. Denken Sie daran, wenn Sie mit cherrypy im Thread-Pool-Modus arbeiten.

Anon
quelle
2
Stimmt es, dass SQLAlchemy nicht threadsicher ist? Wie wird es dann in Pyramid-Apps über WSGI verwendet, die hauptsächlich im Thread-Modus bereitgestellt werden? Jede Bestätigung dieser widersprüchlichen Aussage.
Ravi Kumar
1
Natürlich ist SQLAlchemy threadsicher.
Matthias Urlichs
-7

Ich würde SQLAlchemy ausprobieren

Es ist wirklich einfach zu bedienen und die Modelle, mit denen Sie arbeiten, sind überhaupt nicht schlecht. Django verwendet SQLAlchemy für sein ORM, aber wenn Sie es alleine verwenden, können Sie die volle Leistung nutzen.

Hier ist ein kleines Beispiel zum Erstellen und Auswählen von Orm-Objekten

>>> 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
quelle
18
Django verwendet keine SQLalchemie für sein ORM. Es wurden einige Arbeiten durchgeführt, um sqlalchemy zu einem optionalen ORM zu machen, aber es ist nicht vollständig.
Sherbang