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?


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.


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 .


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

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.


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

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.


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.


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


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.


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.


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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.