Bazı iyi Python ORM çözümleri nelerdir? [kapalı]


209

Ben temelde arka taraftaki bir Python web hizmetiyle görüşen istemci tarafı (tarayıcı) bir JavaScript ön uç olan bir proje için CherryPy kullanarak değerlendiriyorum ve bakıyorum. Yani, ben gerçekten daha sonra bir ORM (tarayıcı JSON) PostgreSQL DB konuşuyor Python kullanarak uygulayabilirsiniz arka ucunda hızlı ve hafif bir şeye ihtiyacım var.

Ayrıca ORM yerleşik olduğu için sevdiğim Django'ya bakıyorum. Ancak, Django gerçekten ihtiyacım olandan biraz daha fazla olabilir düşünüyorum (yani gerçekten == daha yavaş daha fazla özellik?).

Herkes özellikleri ve işlevsellik, hız, verimlilik vb karşılaştırabilir ve kontrast farklı Python ORM çözümleri ile herhangi bir deneyimi var mı?


ponyORM çok hoş görünüyor.
Niklas R

Nesne İlişkisel haritalama (ORM) zaten birçok programlama dilinde çok popüler ve SQL için en iyi alternatiflerden biri. TRIADB projem için CQL oluşturmak için yöntem zincirleme stilinden ilham aldım. healis.eu/triadb/#latest-release
Athanassios

Yanıtlar:


96

SQLAlchemy daha tam özellikli ve güçlüdür (DataMapper modelini kullanır). Django ORM daha temiz bir sözdizimine sahiptir ve (ActiveRecord şablonu) için yazılması daha kolaydır. Performans farklarını bilmiyorum.

SQLAlchemy ayrıca, bazı karmaşıklığı gizleyen ve Django ORM'ye daha çok benzeyen bir ActiveRecord tarzı sözdizimi veren bildirici bir katmana sahiptir.

Django'nun "çok ağır" olması konusunda endişelenmezdim. Geri kalanını içe aktarmak zorunda kalmadan isterseniz ORM'yi kullanabileceğiniz kadar ayrıştırılmıştır .

Bu, zaten web katmanı için CherryPy kullanıyor ve sadece bir ORM gerekiyorsa, muhtemelen SQLAlchemy tercih ediyorum dedi.


7
Ancak Django'nun ORM'sini beğenmediyseniz ve örneğin SA kullanmak istiyorsanız, yönetici gibi django'nun birçok özelliğini kaybedersiniz. Bir anlaşma kırıcı değil, tenli bir diz.
Gregg Lind

22
Doğru, ama sadece bir Python ORM seçmekle ilgili olan soru ile alakasız; otomatik olarak oluşturulan yönetici arayüzleri veya diğer çerçeve bileşenleri hakkında değil.
Carl Meyer

8
SQLAlchemy'nin hafif olmaktan başka bir şey olduğunu iddia ederim - yine de oldukça hızlı olabilir. Projemi karışıma atacağım, buna peewee denir ve postgres ile konuşur. Yakın zamanda django tarzı sorgulama desteği de eklendi! charlesleifer.com/docs/peewee
coleifer

3
Lütfen Django ORM'nin bileşik birincil anahtarları desteklemediğini ve SQLAlchemy'nin desteklediğini unutmayın.
Marcin Kapusta

1
@yegle Yorumunuzla kafam karıştı. Mantığı anlamıyorum. " ORDER BY DESCDokümanlardaki talimatları bulmak zor" nasıl " etkin kayıt düzeni için kötü" anlamına geliyor?
jpmc26

108

Hafif arıyorsanız ve zaten django tarzı bildirim modellerine aşina iseniz, peewee'ye göz atın: https://github.com/coleifer/peewee

Misal:

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

Daha fazla örnek için dokümanlara bakın.


bu soru için bana yardım edebilir misin? Pls ru.stackoverflow.com/q/1114189/293323
Çerez

81

Storm tartışmasız en basit API'ya sahip:

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

Ve ihtiyacınız olduğunda ham SQL'e düşmeyi ağrısız hale getirir:

store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', []) 
store.commit()

Storm'un şu an için yalnızca MySQL ve PostgreSQL'i desteklediğine dikkat edilmelidir. Oracle desteği de çalışmalarda.
Jason Baker

15
Yukarıdaki örneğin önerdiği gibi
SQLite'yi

2
quick_orm, Storm kadar basittir ve SQLAlchemy üzerine kurulmuştur, bu yüzden de çok güçlüdür: pypi.python.org/pypi/quick_orm . Yasal Uyarı: Ben quick_orm
Tyler Long

8
Fırtına korunmuyor. Yeni projeler için kullanmam.
Matthias Urlichs

3
Ayrıca, Python 3 için Fırtına yok gibi görünüyor
ygormutti

27

Genellikle SQLAlchemy kullanıyorum . Oldukça güçlü ve muhtemelen en olgun python ORM.

CherryPy kullanmayı planlıyorsanız, Robert Brewer (şu anda CherryPy proje lideri olan adam) tarafından olduğu gibi dejavu'ya da bakabilirsiniz . Ben şahsen kullanmadım, ama onu seven bazı insanlar tanıyorum.

SQLObject , ORM'yi kullanmak için SQLAlchemy'den biraz daha kolaydır, ancak o kadar güçlü değildir.

Şahsen, tüm projeyi Django'da yazmayı planlamıyorsam Django ORM'yi kullanmazdım, ama bu sadece benim.


SQLObject harika - kullanımı kolay, veritabanından bağımsız ve aslında tabloları sizin için yapabilir! (Tembelim).
Lucas Jones

1
@Lucas - SQLAlchemy de olabilir ...
Jason Baker

Hatırlayabildiğim kadarıyla, genellikle SQLObject'e iltifat ediyordum. Uzun zaman önceydi, ama ... :)
Lucas Jones

@Lucas - Ben öyle düşündüm. Sadece not edeceğimi düşündüm. :-)
Jason Baker

17

0.5'de standart hale gelen SQLAlchemy'nin bildirimsel uzantısı, Django veya Storm'a çok benzeyen hepsi bir arada arabirim sağlar. Ayrıca datamapper stili kullanılarak yapılandırılmış sınıflar / tablolarla sorunsuz bir şekilde bütünleşir:

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

Ancak one_to_many, many_to_many, table miras gibi birçok ilişki varsa işler çok karmaşık hale gelir. Bunları işlemek için elle çok sayıda kod yazmanız gerekir. Quick ORM için cevabımı kontrol et. Zaman kazanabilirsiniz.
Tyler Long

18
:) Tyler SQLAlchemy'nin yaratıcısına Quick ORM kullanması gerektiğini söyledi.
Anthony Briggs

5
:) Bir yıl önce bana hatırlattı usenet üzerinde gerçekten anlamadığını dmr @ alice ile tartışırken hatırlatıyor
Peter Rowell

@AnthonyBriggs, bu slaydı kontrol edin ve quick_orm'un SQLAlchemy'den karmaşık ilişkilerin ele alınmasında neden daha iyi olduğunu göreceksiniz: slideshare.net/tyler4long/quickorm
Tyler Long

10

İksiri SQLAlchemy ile birlikte kullanıyoruz ve şimdiye kadar beğendik. Elixir, SQLAlchemy'nin üzerine daha çok "ActiveRecord deseni" sayaç parçalarına benzeyen bir katman yerleştirir.


2
SQLAlchemy, OOP ve fonksiyonel stilleri kutudan çıkarır, Elixir bunun üzerine bildirici programlama stili ekler (çoğunlukla model bildirimleri için ancak genişletilebilir).
muhuk

5

Bu, Python'da üst düzey veritabanı etkileşimi için standart referans noktası gibi görünüyor: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

Oradan, Dejavu Martin Fowler'in DataMapper desenini oldukça soyut bir şekilde Python'da uyguluyor gibi görünüyor .


İlgilenip Dejavu'ya baktım. Sadece biraz. Belgeler çok seyrek (qoute "kendi başınıza olduğunuz sunum katmanı için") bu yüzden sadece ileri düzey kullanıcılar için söyleyebilirim.
r4.

1

Sanırım şuna bakabilirsiniz:

Sonbahar

Fırtına


Sonbahar muhtemelen Fırtınadan daha kolaydır, ancak Fırtına Sonbahar'ın sahip olmadığı birçok özellik içerir. Bu seçeneklerin her ikisi de sınırlı dokümantasyona sahiptir, ancak Storm bu kadar hızlı onarıyor!
alecwh

Teşekkür ederim, Sonbahar çok güzel ve çekici görünüyor, ancak benim için bir anlaşma kırıcı olan sıfır dokümantasyona sahip.
temoto

1
Sonbahar sayfasındaki bazı örnekleri denedim ve paket yöneticimin yüklediği kod sürümü ile bile çalışmıyorlar. Google grubundaki yayınlar da eskidir. Görünüşe göre proje yavaş ölüyor. Kullanarak tavsiye etmem.
Jason Miesionczek

Öte yandan, fırtına hızla benim ORM seçimim haline geliyor. Dokümanlar daha iyi oluyor ve API temiz ve basit, biraz daha Django ORM tarafından kullanılan ActiveRecord desen için kullanılan olsa da, ben gezinmek kolay Fırtına bulma.
Jason Miesionczek

1
Tortumun bir yıl boyunca herhangi bir faaliyeti yok gibi görünüyor. groups.google.com/group/autumn-orm
Sridhar Ratnakumar

1

Django'daki kullanılmayan özelliklerin performans cezası vermesinin makul bir yolu yoktur. Projeyi yükseltmeye karar verirseniz kullanışlı olabilir.


8
Orada bir olduğunu concievable yolu
bukzor

0

Küçük bir proje için Storm + SQLite kullandım ve çok işlemciliğe kadar çok mutlu oldum. Veritabanını birden çok işlemden kullanmaya çalışmak "Veritabanı kilitli" özel durumu ile sonuçlandı. SQLAlchemy'ye geçtim ve aynı kod sorunsuz çalıştı.


7
Adil olmak gerekirse, SQLite gerçekten eşzamanlı erişim için tasarlanmamıştır.
Xiong Chiamiov

2
@Xion +1. SQLITE hiçbir daemon çalışmayan tek bir dosyadır.
e-satis

-1

SQLAlchemy çok, çok güçlü. Ancak, iplik güvenli değildir, iplik havuzu modunda cherrypy ile çalışırken bunu aklınızda bulundurun.


2
SQLAlchemy'nin threadsafe olmadığı doğru mu? Peki WSGI üzerinden piramit uygulamalarında nasıl kullanılır, ki bunlar esas olarak insanların dişli modda dağıtır? Bu çelişkili açıklamaya herhangi bir onay.
Ravi Kumar

1
Elbette SQLAlchemy iş parçacığı için güvenlidir.
Matthias Urlichs

-7

SQLAlchemy'yi kontrol ederdim

Kullanımı gerçekten çok kolay ve birlikte çalıştığınız modeller hiç de fena değil. Django, ORM için SQLAlchemy kullanıyor ancak tek başına kullanmak tam gücünü kullanmanıza izin veriyor.

Orm nesneleri oluşturma ve seçme ile ilgili küçük bir örnek

>>> 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 yok değil 's ORM için SQLAlchemy kullanın. Sqlalchemy'yi isteğe bağlı bir ORM yapmak için bazı çalışmalar yapıldı, ancak tam değil.
sherbang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.