Jakie są dobre rozwiązania ORM Pythona? [Zamknięte]

209

Oceniam i patrzę na użycie CherryPy dla projektu, który jest w zasadzie interfejsem JavaScript po stronie klienta (przeglądarki), który komunikuje się z usługą internetową Python na zapleczu. Tak więc naprawdę potrzebuję czegoś szybkiego i lekkiego na zapleczu, które mogę wdrożyć za pomocą Pythona, który następnie komunikuje się z bazą danych PostgreSQL za pośrednictwem ORM (JSON do przeglądarki).

Patrzę też na Django, które mi się podoba, ponieważ jego ORM jest wbudowany. Myślę jednak, że Django może być trochę więcej niż naprawdę potrzebuję (tj. Więcej funkcji niż naprawdę potrzebuję == wolniej?).

Czy ktoś ma jakieś doświadczenie z różnymi rozwiązaniami Python ORM, które mogą porównywać i kontrastować ich funkcje i funkcje, szybkość, wydajność itp.?

eLuke
źródło
ponyORM wygląda całkiem nieźle.
Niklas R
Mapowanie obiektowo-relacyjne (ORM) jest już bardzo popularne w wielu językach programowania i jest jedną z najlepszych alternatyw dla SQL. Zainspirowałem się stylem tworzenia łańcuchów metod do tworzenia CQL dla mojego projektu TRIADB. healis.eu/triadb/#latest-release
Athanassios

Odpowiedzi:

96

SQLAlchemy jest bardziej w pełni funkcjonalny i potężny (wykorzystuje wzorzec DataMapper). Django ORM ma czystszą składnię i łatwiej jest pisać (wzorzec ActiveRecord). Nie wiem o różnicach wydajności.

SQLAlchemy ma również warstwę deklaratywną, która ukrywa pewną złożoność i nadaje jej składnię w stylu ActiveRecord bardziej podobną do Django ORM.

Nie martwiłbym się, że Django będzie „zbyt ciężki”. Jest na tyle oddzielony, że możesz użyć ORM, jeśli chcesz, bez konieczności importowania reszty .

To powiedziawszy, jeśli już korzystałem z CherryPy dla warstwy internetowej i potrzebowałem tylko ORM, prawdopodobnie wybrałbym SQLAlchemy.

Carl Meyer
źródło
7
Ale jeśli nie lubisz ORM Django i chcesz na przykład użyć SA, tracisz wiele funkcji django, takich jak admin. Nie łamacz interesów, ale oskórowane kolano.
Gregg Lind
22
To prawda, ale nie ma znaczenia dla pytania, które polegało po prostu na wyborze ORM Pythona; nie chodzi o automatycznie generowane interfejsy administracyjne lub inne komponenty frameworka.
Carl Meyer
8
Twierdziłbym, że SQLAlchemy nie jest wcale lekki - może być jednak dość szybki. Wrzucę mój projekt do miksu, nazywa się Peewee i mówi do Postgres. Niedawno dodano także obsługę zapytań w stylu django! charlesleifer.com/docs/peewee
coleifer
3
Należy również pamiętać, że Django ORM nie obsługuje złożonych kluczy podstawowych i SQLAlchemy go obsługuje.
Marcin Kapusta,
1
@ czat Jestem zdezorientowany twoim komentarzem. Nie rozumiem logiki. W jaki sposób „trudno znaleźć instrukcje ORDER BY DESCw dokumentacji” oznacza „zły dla aktywnego wzorca zapisu”?
jpmc26
108

Jeśli szukasz lekkości i znasz już modele deklaratywne w stylu django, sprawdź peewee: https://github.com/coleifer/peewee

Przykład:

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

Sprawdź dokumenty, aby uzyskać więcej przykładów.

coleifer
źródło
czy możesz mi pomóc na to pytanie? Pls ru.stackoverflow.com/q/1114189/293323
Cookie
81

Storm ma prawdopodobnie najprostszy interfejs 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()

I sprawia, że ​​bezbolesne jest wpadanie do surowego SQL, gdy trzeba:

store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', []) 
store.commit()
Patrick
źródło
Należy zauważyć, że Storm obsługuje obecnie MySQL i PostgreSQL. Wsparcie Oracle jest jednak w toku.
Jason Baker,
15
Obsługuje również SQLite, jak sugeruje powyższy przykład
shearichard
2
quick_orm jest tak prosty jak Storm i jest oparty na SQLAlchemy, więc jest również bardzo wydajny: pypi.python.org/pypi/quick_orm . Oświadczenie: Jestem autorem quick_orm
Tyler Long
8
Storm nie jest utrzymywany. Nie użyłbym tego do nowych projektów.
Matthias Urlichs,
3
Wydaje się też, że nie ma burzy dla Pythona 3
ygormutti,
27

Zwykle używam SQLAlchemy . Jest dość potężny i jest prawdopodobnie najbardziej dojrzałym ORM-em Pythona.

Jeśli planujesz używać CherryPy, możesz również zajrzeć do dejavu, ponieważ jest to Robert Brewer (facet, który jest obecnie kierownikiem projektu CherryPy). Osobiście nie korzystałem z niego, ale znam kilka osób, które to uwielbiają.

SQLObject jest nieco łatwiejszy w użyciu ORM niż SQLAlchemy, ale nie jest tak potężny.

Osobiście nie używałbym Django ORM, chyba że planowałem napisać cały projekt w Django, ale to tylko ja.

Jason Baker
źródło
SQLObject jest świetny - prosty w obsłudze, niezależny od bazy danych i może tworzyć tabele dla Ciebie! (Jestem leniwy).
Lucas Jones
1
@Lucas - Podobnie SQLAlchemy ...
Jason Baker
O ile pamiętam, ogólnie komplementowałem SQLObject. To było dawno temu ... :)
Lucas Jones,
@Lucas - tak myślałem. Pomyślałem, że to zanotuję. :-)
Jason Baker
17

Deklaratywne rozszerzenie SQLAlchemy , które staje się standardem w wersji 0.5, zapewnia interfejs typu „wszystko w jednym” bardzo podobny do interfejsu Django lub Storm. Bezproblemowo integruje się również z klasami / tabelami skonfigurowanymi za pomocą stylu 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
źródło
Ale sprawy stają się bardzo złożone, jeśli istnieje wiele relacji, takich jak one_to_many, many_to_many, dziedziczenie tabeli. Musisz ręcznie napisać dużo kodu, aby sobie z nimi poradzić. Sprawdź moją odpowiedź na szybkie ORM. Może zaoszczędzić Twój czas.
Tyler Long
18
:) w Tyler mówi twórcy SQLAlchemy, że powinien użyć Quick ORM.
Anthony Briggs
5
:) Przypomina mi kogoś przed laty na usencie, który kłócił się z dmr @ alice, że tak naprawdę nie rozumiał C.
Peter Rowell
@AnthonyBriggs, sprawdź ten slajd, a zobaczysz, dlaczego quick_orm lepiej radzi sobie ze złożonymi relacjami niż SQLAlchemy: slideshare.net/tyler4long/quickorm
Tyler Long
10

Używamy Elixir wraz z SQLAlchemy i do tej pory nam się podobało. Elixir nakłada warstwę na SQLAlchemy, dzięki czemu wygląda bardziej jak części licznika „wzorzec ActiveRecord”.

airportyh
źródło
2
SQLAlchemy obsługuje OOP i style funkcjonalne po wyjęciu z pudełka, Elixir dodaje deklaratywny styl programowania (głównie dla deklaracji modelu, ale można go rozszerzyć).
muhuk,
5

To wydaje się być kanonicznym punktem odniesienia dla interakcji z bazą danych wysokiego poziomu w Pythonie: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

Stąd wygląda na to, że Dejavu implementuje wzorzec DataMapper Martina Fowlera dość abstrakcyjnie w Pythonie.

entropo
źródło
Byłem zainteresowany i spojrzałem na Dejavu. Tylko trochę. Dokumentacja jest bardzo rzadka (qoute „dla warstwy prezentacji, którą jesteś sam”), więc powiedziałbym, że tylko dla zaawansowanych użytkowników.
r4.
1

Myślę, że możesz spojrzeć na:

Jesień

Burza

Lukas Šalkauskas
źródło
Jesień jest prawdopodobnie łatwiejsza niż Storm, ale Storm zawiera wiele funkcji, których nie ma. Obie te opcje mają ograniczoną dokumentację, chociaż Storm naprawia to szybko!
alecwh
Dziękuję, jesień wygląda bardzo ładnie i atrakcyjnie, ale ma zerową dokumentację, co jest dla mnie przełomem.
temoto
1
Właśnie wypróbowałem kilka przykładów na stronie jesiennej i nawet nie działają one z wersją kodu zainstalowanego przez mojego menedżera pakietów. Posty w grupie Google są również stare. Wygląda na to, że projekt umiera powoli. Nie polecam go używać.
Jason Miesionczek
Z drugiej strony Storm szybko staje się moją ulubioną ORM. Dokumenty stają się coraz lepsze, a interfejs API jest przejrzysty i prosty, chociaż jestem nieco bardziej przyzwyczajony do wzorca ActiveRecord stosowanego przez Django ORM, uważam, że Storm jest łatwy w nawigacji.
Jason Miesionczek
1
Wydaje się, że Autum nie prowadzi żadnej działalności przez rok. groups.google.com/group/autumn-orm
Sridhar Ratnakumar
1

Nie ma możliwego sposobu, aby nieużywane funkcje w Django spowodowały spadek wydajności. Może się przydać, jeśli kiedykolwiek zdecydujesz się na ulepszenie projektu.

Carl Meyer
źródło
8
jest możliwy do przyjęcia sposób
bukzor
0

Użyłem Storm + SQLite do małego projektu i byłem z niego bardzo zadowolony, dopóki nie dodałem wieloprocesowości. Próba użycia bazy danych z wielu procesów spowodowała wyjątek „Baza danych jest zablokowana”. Przełączyłem się na SQLAlchemy i ten sam kod działał bez żadnych problemów.

Phil Loden
źródło
7
Szczerze mówiąc, SQLite nie jest tak naprawdę zaprojektowany do jednoczesnego dostępu.
Xiong Chiamiov
2
@Xion +1. SQLITE to tylko jeden plik, bez uruchomionego demona.
e-satis
-1

SQLAlchemy jest bardzo, bardzo potężny. Jednak nie jest to bezpieczne dla wątków, pamiętaj o tym podczas pracy z Cherrypy w trybie puli wątków.

Zaraz
źródło
2
czy to prawda, że ​​SQLAlchemy nie jest wątkowo bezpieczny? Jak zatem jest używany w aplikacjach Pyramid przez WSGI, które głównie ludzie wdrażają w trybie wątkowym? Wszelkie potwierdzenie tego sprzecznego oświadczenia.
Ravi Kumar,
1
Oczywiście SQLAlchemy jest bezpieczny dla wątków.
Matthias Urlichs,
-7

Sprawdziłbym SQLAlchemy

Jest naprawdę łatwy w użyciu, a modele, z którymi pracujesz, wcale nie są złe. Django używa SQLAlchemy do ORM, ale użycie go samo w sobie pozwala na wykorzystanie jego pełnej mocy.

Oto mały przykład tworzenia i wybierania obiektów 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')>
Tam
źródło
18
Django nie używa sqlalchemy do ORM. Podjęto pewne prace, aby uczynić sqlalchemy opcjonalnym ORM, ale nie jest kompletny.
sherbang