Jakie są dobre rozwiązania Python ORM? [zamknięte]

Oceniam i patrzę na użycie CherryPy dla projektu, który jest w zasadzie interfejsem JavaScript od strony klienta (przeglądarki), który rozmawia z usługą internetową Pythona na zapleczu. Tak więc, naprawdę potrzebuję czegoś szybkiego i lekkiego na zapleczu, które mogę zaimplementować za pomocą Pythona, który następnie przemawia do PostgreSQL DB poprzez ORM(JSON do przeglądarki).

Patrzę również na Django, które mi się podoba, ponieważ jego ORM jest wbudowany. Jednak myślę, że Django może być trochę więcej niż ja really need (czyli więcej funkcji niż naprawdę potrzebuję = = wolniej?).

Każdy ma jakieś doświadczenie z różnymi rozwiązaniami Pythona ORM, które mogą porównywać I porównywać swoje funkcje i funkcjonalność, szybkość, wydajność itp.?

 187
Author: the Tin Man, 2008-09-10

12 answers

SQLAlchemy jest bardziej funkcjonalny i potężny (używa wzorca DataMapper). Django ORM ma czystszą składnię i jest łatwiejsze do napisania (wzór ActiveRecord). Nie znam się na różnicach w wydajności.

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

Nie martwiłbym się, że Django jest " zbyt ciężki."Jest na tyle odsprzęgnięty, że możesz użyć ORM, jeśli chcesz bez konieczności importowania reszty.

To powiedziawszy, gdybym już używał CherryPy dla warstwy internetowej i potrzebował ORM, prawdopodobnie wybrałbym SQLAlchemy.

 83
Author: Carl Meyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-09 14:50:40

Jeśli szukasz lekkiego i jesteś już zaznajomiony z modelami deklaratywnymi 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ź docs, aby uzyskać więcej przykładów.

 95
Author: coleifer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-05 01:20:13

Storm ma prawdopodobnie najprostsze 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 Spadanie do surowego SQL, gdy trzeba:

store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', []) 
store.commit()
 77
Author: jbatista,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-05 16:46:03

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

Jeśli planujesz używać CherryPy, możesz również spojrzeć na dejavu , ponieważ jest to Robert Brewer (facet, który jest obecnym liderem projektu CherryPy). Osobiście go nie używałem, ale znam ludzi, którzy go uwielbiają.

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

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

 27
Author: Jason Baker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-10 15:02:58

Deklaratywne rozszerzenie SQLAlchemy , które staje się standardem w 0.5, zapewnia interfejs all in one bardzo podobny do interfejsu Django czy Storm. Integruje się również bezproblemowo 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()
 17
Author: zzzeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 14:25:22

Używamy Elixir obok SQLAlchemy i do tej pory nam się podobał. Elixir nakłada na SQLAlchemy warstwę, która sprawia, że wygląda ona bardziej jak elementy licznika "ActiveRecord pattern".

 9
Author: airportyh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-11 03:44:54

Wydaje się być kanonicznym punktem odniesienia dla interakcji bazy danych wysokiego poziomu w Pythonie: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

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

 4
Author: entropo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-21 23:29:54

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

Jesień

Storm

 1
Author: Lukas Šalkauskas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-10 04:56:53

Nie ma możliwości, aby nieużywane funkcje w Django dały karę za wydajność. Może się przydać, jeśli kiedykolwiek zdecydujesz się na zwiększenie skali projektu.

 1
Author: Carl Meyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 18:55:24

SQLAlchemy jest bardzo, bardzo potężny. Jednak nie jest to bezpieczne dla wątków upewnij się, że masz to na uwadze podczas pracy z cherrypy w trybie puli wątków.

 0
Author: Anon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-24 19:37:47

Używałem Storm + SQLite do małego projektu i byłem z niego całkiem zadowolony, dopóki nie dodałem multiprocessingu. 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 problemów.

 0
Author: Phil Loden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-05 18:28:40

Sprawdziłbym SQLAlchemy

Jest naprawdę łatwy w użyciu, a modele, z którymi pracujesz, nie są złe. Django używa SQLAlchemy, ponieważ jest ORM , ale używanie go samo w sobie pozwala Ci korzystać z pełnej mocy.

Oto mały przykład tworzenia i zaznaczania 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')>
 -5
Author: Yon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-06 20:57:41