Apa sajakah solusi Python ORM yang bagus? [Tutup]

210

Saya mengevaluasi dan melihat menggunakan CherryPy untuk proyek yang pada dasarnya adalah JavaScript front-end dari sisi klien (browser) yang berbicara dengan layanan web Python di back-end. Jadi, saya benar-benar membutuhkan sesuatu yang cepat dan ringan di bagian belakang yang dapat saya terapkan menggunakan Python yang kemudian berbicara kepada DB PostgreSQL melalui ORM (JSON ke browser).

Saya juga melihat Django, yang saya suka, karena ORM-nya built-in. Namun, saya pikir Django mungkin sedikit lebih dari yang saya butuhkan (yaitu lebih banyak fitur daripada yang saya butuhkan == lebih lambat?).

Adakah yang punya pengalaman dengan solusi Python ORM berbeda yang dapat membandingkan dan membedakan fitur dan fungsionalitas, kecepatan, efisiensi, dll.?

eLuke
sumber
ponyORM terlihat cukup bagus.
Niklas R
Object-Relational mapping (ORM) sudah sangat populer di banyak bahasa pemrograman dan salah satu alternatif terbaik untuk SQL. Saya terinspirasi dari gaya metode chaining untuk membuat CQL untuk proyek TRIADB saya. healis.eu/triadb/#latest-release
Athanassios

Jawaban:

96

SQLAlchemy lebih berfitur lengkap dan kuat (menggunakan pola DataMapper). Django ORM memiliki sintaks yang lebih bersih dan lebih mudah ditulis untuk (pola ActiveRecord). Saya tidak tahu tentang perbedaan kinerja.

SQLAlchemy juga memiliki lapisan deklaratif yang menyembunyikan beberapa kompleksitas dan memberinya sintaks gaya ActiveRecord yang lebih mirip dengan Django ORM.

Saya tidak akan khawatir kalau Django "terlalu berat." Cukup dipisahkan sehingga Anda dapat menggunakan ORM jika Anda mau tanpa harus mengimpor sisanya .

Yang mengatakan, jika saya sudah menggunakan CherryPy untuk lapisan web dan hanya membutuhkan ORM, saya mungkin akan memilih SQLAlchemy.

Carl Meyer
sumber
7
Tetapi jika Anda tidak menyukai ORANG Django, dan ingin menggunakan SA, misalnya, Anda kehilangan banyak fitur Django, seperti admin. Bukan deal breaker, tapi lutut yang berkulit.
Gregg Lind
22
Benar, tetapi tidak relevan dengan pertanyaan, yang hanya tentang memilih ORM Python; bukan tentang antarmuka admin yang dibuat secara otomatis atau komponen kerangka lainnya.
Carl Meyer
8
Saya berpendapat bahwa SQLAlchemy adalah sesuatu yang ringan - itu bisa sangat cepat. Saya akan melempar proyek saya dalam campuran, itu disebut peewee dan itu berbicara ke postgres. Baru-baru ini menambahkan dukungan untuk permintaan gaya-Django! charlesleifer.com/docs/peewee
coleifer
3
Harap perhatikan juga bahwa Django ORM tidak mendukung kunci primer komposit dan SQLAlchemy mendukungnya.
Marcin Kapusta
1
@yegle Saya bingung dengan komentar Anda. Saya tidak mengerti logikanya. Bagaimana "sulit untuk menemukan petunjuk ORDER BY DESCdalam dokumen" menyiratkan "buruk untuk pola rekaman aktif"?
jpmc26
108

Jika Anda mencari yang ringan dan sudah terbiasa dengan model deklaratif gaya django, lihat peewee: https://github.com/coleifer/peewee

Contoh:

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

Periksa dokumen untuk contoh lebih lanjut.

coleifer
sumber
dapatkah kamu membantu saya untuk pertanyaan ini? Pls ru.stackoverflow.com/q/1114189/293323
Cookie
81

Storm memiliki API paling sederhana:

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

Dan itu membuatnya sulit untuk drop down ke SQL mentah ketika Anda perlu:

store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', []) 
store.commit()
Patrick
sumber
Perlu dicatat bahwa Storm hanya mendukung MySQL dan PostgreSQL pada saat ini. Dukungan Oracle sedang dalam proses.
Jason Baker
15
Ini juga mendukung SQLite seperti contoh di atas menunjukkan
shearichard
2
quick_orm semudah Storm dan dibangun di atas SQLAlchemy sehingga juga sangat kuat: pypi.python.org/pypi/quick_orm . Penafian: Saya penulis quick_orm
Tyler Long
8
Badai tidak terawat. Saya tidak akan menggunakannya untuk proyek baru.
Matthias Urlichs
3
Juga, sepertinya tidak ada Storm untuk Python 3
ygormutti
27

Saya biasanya menggunakan SQLAlchemy . Ini cukup kuat dan mungkin ORM python yang paling matang.

Jika Anda berencana menggunakan CherryPy, Anda mungkin juga melihat dejavu karena itu oleh Robert Brewer (orang yang merupakan pemimpin proyek CherryPy saat ini). Saya pribadi belum menggunakannya, tetapi saya tahu beberapa orang yang menyukainya.

SQLObject sedikit lebih mudah untuk menggunakan ORM daripada SQLAlchemy, tetapi itu tidak cukup kuat.

Secara pribadi, saya tidak akan menggunakan Django ORM kecuali saya berencana untuk menulis seluruh proyek di Django, tapi itu hanya saya.

Jason Baker
sumber
SQLObject sangat bagus - mudah digunakan, database-independen dan itu benar-benar dapat membuat tabel untuk Anda! (Aku malas).
Lucas Jones
1
@Lucas - Begitu juga SQLAlchemy ...
Jason Baker
Sejauh yang saya ingat, saya hanya umumnya memuji SQLObject. Itu sudah lama sekali, meskipun ... :)
Lucas Jones
@ Lucas - Saya pikir begitu. Kupikir aku akan mencatatnya. :-)
Jason Baker
17

Ekstensi deklaratif SQLAlchemy , yang menjadi standar dalam 0,5, menyediakan antarmuka semua dalam satu sangat mirip dengan Django atau Storm. Itu juga terintegrasi dengan mulus dengan kelas / tabel yang dikonfigurasi menggunakan gaya 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
sumber
Tetapi hal-hal menjadi sangat kompleks jika ada banyak hubungan seperti one_to_many, many_to_many, tabel inheritance. Anda harus menulis banyak kode dengan tangan untuk menanganinya. Periksa jawaban saya untuk ORM Cepat. Itu bisa menghemat waktu Anda.
Tyler Long
18
:) di Tyler memberitahu pencipta SQLAlchemy bahwa ia harus menggunakan ORM Cepat.
Anthony Briggs
5
:) Mengingatkan saya pada seseorang bertahun-tahun yang lalu di usenet berdebat dengan dmr @ alice bahwa dia tidak benar-benar mengerti C.
Peter Rowell
@AnthonyBriggs, periksa slide ini dan Anda akan melihat mengapa quick_orm lebih baik dalam menangani hubungan yang kompleks daripada SQLAlchemy: slideshare.net/tyler4long/quickorm
Tyler Long
10

Kami menggunakan Elixir bersama SQLAlchemy dan sejauh ini menyukainya. Elixir menempatkan lapisan di atas SQLAlchemy yang membuatnya tampak lebih seperti bagian penghitung "pola ActiveRecord".

airportyh
sumber
2
SQLAlchemy mendukung OOP dan gaya fungsional di luar kotak, Elixir menambahkan gaya pemrograman deklaratif (kebanyakan untuk deklarasi model tetapi dapat diperluas) di atasnya.
muhuk
5

Ini tampaknya menjadi titik referensi kanonik untuk interaksi basis data tingkat tinggi dengan Python: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

Dari sana, sepertinya Dejavu mengimplementasikan pola DataMapper Martin Fowler secara abstrak dalam Python.

entropo
sumber
Saya tertarik dan memandang Dejavu. Hanya sedikit. Dokumentasi sangat jarang (qoute "untuk lapisan presentasi Anda sendiri") jadi hanya untuk pengguna tingkat lanjut saya akan mengatakan.
r4.
1

Saya pikir Anda mungkin melihat:

Musim gugur

Badai

Lukas Šalkauskas
sumber
Musim gugur mungkin lebih mudah daripada Storm, tetapi Storm mencakup banyak fitur yang tidak dimiliki Autumn. Kedua opsi ini memiliki dokumentasi terbatas, meskipun Storm memperbaiki secepat itu!
alecwh
Terima kasih, Autumn terlihat sangat bagus dan menarik, tetapi tidak memiliki dokumentasi, yang merupakan kesepakatan bagi saya.
temoto
1
Saya baru saja mencoba beberapa contoh di halaman Musim Gugur, dan mereka bahkan tidak bekerja dengan versi kode yang diinstal oleh manajer paket saya. Posting di grup google juga sudah tua. Sepertinya proyek ini mati perlahan. Tidak akan merekomendasikan menggunakannya.
Jason Miesionczek
Storm di sisi lain, dengan cepat menjadi ORM pilihan saya. Documents menjadi lebih baik, dan APInya bersih dan sederhana, meskipun saya sedikit lebih terbiasa dengan pola ActiveRecord yang digunakan oleh Django ORM, saya menemukan Storm mudah dinavigasi.
Jason Miesionczek
1
Autum tampaknya tidak memiliki aktivitas apa pun selama setahun. groups.google.com/group/autumn-orm
Sridhar Ratnakumar
1

Tidak ada cara yang mungkin bahwa fitur yang tidak digunakan di Django akan memberikan penalti kinerja. Mungkin akan berguna jika Anda memutuskan untuk meningkatkan proyek.

Carl Meyer
sumber
8
ada concievable cara
bukzor
0

Saya menggunakan Storm + SQLite untuk proyek kecil, dan cukup senang dengan itu sampai saya menambahkan multiprocessing. Mencoba menggunakan database dari berbagai proses menghasilkan pengecualian "Database terkunci". Saya beralih ke SQLAlchemy, dan kode yang sama berfungsi tanpa masalah.

Phil Loden
sumber
7
Agar adil, SQLite tidak benar-benar dirancang untuk akses bersamaan.
Xiong Chiamiov
2
@Xion +1. SQLITE adalah satu-satunya file, tanpa daemon berjalan.
e-satis
-1

SQLAlchemy sangat, sangat kuat. Namun itu bukan thread aman, pastikan Anda mengingatnya saat bekerja dengan cherrypy dalam mode thread-pool.

Segera
sumber
2
apakah benar SQLAlchemy bukan threadsafe? Lalu bagaimana ini digunakan dalam aplikasi Piramida di atas WSGI, yang terutama digunakan orang dalam mode berulir? Segala konfirmasi terhadap pernyataan yang bertentangan ini.
Ravi Kumar
1
Tentu saja SQLAlchemy aman untuk digunakan.
Matthias Urlichs
-7

Saya akan memeriksa SQLAlchemy

Ini sangat mudah digunakan dan model yang Anda gunakan tidak buruk sama sekali. Django menggunakan SQLAlchemy untuk ORM-nya, tetapi menggunakannya dengan sendirinya memungkinkan Anda menggunakannya dengan kekuatan penuh.

Berikut adalah contoh kecil tentang cara membuat dan memilih objek 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')>
Yon
sumber
18
Django tidak menggunakan sqlalchemy untuk ORM-nya. Ada beberapa pekerjaan yang dilakukan untuk menjadikan sqlalchemy ORM opsional, tetapi tidak lengkap.
sherbang