कुछ अच्छे पायथन ओआरएम समाधान क्या हैं? [बन्द है]


209

मैं मूल्यांकन कर रहा हूं और एक परियोजना के लिए चेरीपी का उपयोग कर रहा हूं जो मूल रूप से क्लाइंट-साइड (ब्राउज़र) से एक जावास्क्रिप्ट फ्रंट-एंड है जो बैक-एंड पर पायथन वेब सेवा से बात करता है। तो, मुझे वास्तव में बैक-एंड पर कुछ तेज और हल्के की आवश्यकता है जिसे मैं पायथन का उपयोग करके कार्यान्वित कर सकता हूं जो तब एक ORM (ब्राउज़र के लिए JSON) के माध्यम से PostgreSQL DB से बात करता है।

मैं Django को भी देख रहा हूं, जो मुझे पसंद है, क्योंकि इसका ORM बिल्ट-इन है। हालाँकि, मुझे लगता है कि Django थोड़ा अधिक हो सकता है जितना मुझे वास्तव में ज़रूरत है (यानी मुझे वास्तव में ज़रूरत से ज़्यादा फ़ीचर्स == स्लैम)।

किसी को भी विभिन्न पायथन ओआरएम समाधानों के साथ कोई अनुभव नहीं है जो उनकी विशेषताओं और कार्यक्षमता, गति, दक्षता आदि की तुलना और तुलना कर सकते हैं?


टट्टू बहुत अच्छा लग रहा है।
निकल्स आर

ऑब्जेक्ट-रिलेशनल मैपिंग (ORM) पहले से ही कई प्रोग्रामिंग भाषाओं में बहुत लोकप्रिय है और SQL के लिए सबसे अच्छे विकल्पों में से एक है। मैं अपने TRIADB प्रोजेक्ट के लिए CQL बनाने के लिए विधि जंजीर शैली से प्रेरित था। healis.eu/triadb/#latest-release
Athanassios

जवाबों:


96

SQLAlchemy अधिक पूर्ण-विशेषताओं और शक्तिशाली है (DataMapper पैटर्न का उपयोग करता है)। Django ORM में एक क्लीनर सिंटैक्स है और (ActiveRecord पैटर्न) के लिए लिखना आसान है। मैं प्रदर्शन के अंतर के बारे में नहीं जानता।

SQLAlchemy में एक घोषणात्मक परत भी है जो कुछ जटिलता को छिपाती है और इसे DjRO ORM के समान ActiveRecord- शैली सिंटैक्स प्रदान करती है।

मुझे Django के बारे में चिंता नहीं होगी "बहुत भारी।" यह पर्याप्त है कि आप ORM का उपयोग कर सकते हैं यदि आप बाकी आयात किए बिना करना चाहते हैं ।

उस ने कहा, अगर मैं पहले से ही वेब लेयर के लिए चेरीपी का इस्तेमाल कर रहा था और बस एक ओआरएम की जरूरत थी, तो मैं शायद SQLAlhemhemy का विकल्प चुनूंगा।


7
लेकिन अगर आप Django के ORM को पसंद नहीं करते हैं, और SA का उपयोग करना चाहते हैं, उदाहरण के लिए, आप बहुत सारे django के फीचर्स खो देते हैं, जैसे कि एडमिन। डील ब्रेकर नहीं, बल्कि चमड़ी वाला घुटना है।
ग्रेग लिंड

22
यह सच है, लेकिन सवाल के लिए अप्रासंगिक है, जो केवल पायथन ओआरएम चुनने के बारे में था; स्वचालित रूप से उत्पन्न व्यवस्थापक इंटरफेस या अन्य ढांचे के घटकों के बारे में नहीं।
कार्ल मेयर

8
मैं तर्क दूंगा कि SQLAlchemy कुछ भी लेकिन हल्का है - हालांकि यह काफी तेज हो सकता है। मैं अपनी परियोजना को मिश्रण में फेंक दूंगा, इसे पेवी कहा जाता है और यह पोस्टग्रेज के लिए बात करता है। अभी हाल ही में django- शैली क्वेरी के लिए समर्थन भी जोड़ा गया! charlesleifer.com/docs/peewee
coleifer

3
कृपया यह भी ध्यान दें कि Django ORM समग्र प्राथमिक कुंजियों का समर्थन नहीं करता है और SQLAlchemy इसका समर्थन करता है।
मार्सिन कपुस्ता १२'१३

1
@ आपकी टिप्पणी से मैं भ्रमित हूं। मैं तर्क नहीं समझता। ORDER BY DESCडॉक्स पर निर्देशों को खोजने में "कड़ी मेहनत" को "सक्रिय रिकॉर्ड पैटर्न के लिए बुरा" कैसे कहा जाता है?
jpmc26

108

यदि आप हल्के लग रहे हैं और पहले से ही django- शैली की घोषणा मॉडल से परिचित हैं, तो peewee देखें: https://github.com/coleifer/peewee

उदाहरण:

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

अधिक उदाहरणों के लिए डॉक्स जांचें ।


क्या आप इस प्रश्न के लिए मेरी मदद कर सकते हैं? Pls ru.stackoverflow.com/q/1114189/293323
कुकी

81

तूफान ने यकीनन सबसे आसान एपीआई:

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

और यह कच्चे SQL में नीचे ड्रॉप करने के लिए जब आप की जरूरत है दर्द रहित बनाता है:

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

यह ध्यान दिया जाना चाहिए कि तूफान वर्तमान समय में केवल MySQL और PostgreSQL का समर्थन करता है। हालांकि कामों में ओरेकल का समर्थन है।
जेसन बेकर

15
यह SQLite का भी समर्थन करता है जैसा कि ऊपर दिए गए उदाहरण से पता चलता है
shearichard

2
quick_orm स्टॉर्म की तरह सरल है और इसे SQLAlchemy पर बनाया गया है, इसलिए यह बहुत शक्तिशाली है: pypi.python.org/pypi/quick_orm । डिस्क्लेमर: मैं quick_orm का लेखक हूं
टायलर लॉन्ग

8
तूफान से बेहाल है। मैं इसका इस्तेमाल नई परियोजनाओं के लिए नहीं करूंगा।
मथायस उरलिचस

3
इसके अलावा, ऐसा लगता है कि पायथन 3 के लिए कोई तूफान नहीं है
ygormutti

27

मैं आमतौर पर SQLAlchemy का उपयोग करता हूं । यह बहुत शक्तिशाली है और शायद सबसे परिपक्व अजगर ORM है।

यदि आप चेरीपी का उपयोग करने की योजना बना रहे हैं, तो आप dejavu में भी देख सकते हैं क्योंकि यह रॉबर्ट (वह लड़का जो वर्तमान चेरी प्रोजेक्ट लीडर है)। मैंने व्यक्तिगत रूप से इसका उपयोग नहीं किया है, लेकिन मैं कुछ लोगों को जानता हूं जो इसे पसंद करते हैं।

SQLObject ORM का उपयोग SQLAlchemy की तुलना में थोड़ा आसान है, लेकिन यह उतना शक्तिशाली नहीं है।

व्यक्तिगत रूप से, मैं Django ORM का उपयोग नहीं करूंगा जब तक कि मैं पूरे प्रोजेक्ट को Django में लिखने की योजना नहीं बना रहा था, लेकिन यह सिर्फ मुझे है।


SQLObject महान है - सरल-से-उपयोग, डेटाबेस-स्वतंत्र और यह वास्तव में आपके लिए तालिकाओं को बना सकता है! (मैं आलसी हूँ)।
लुकास जोन्स

1
@ लुकास - तो SQLAlchemy ...
जेसन बेकर

जहाँ तक मुझे याद है, मैं आमतौर पर SQLObject की तारीफ कर रहा था। यह एक लंबे समय से पहले था, हालांकि ... :)
लुकास जोन्स

@ लुकास - मुझे ऐसा लगा। बस मैंने सोचा था कि मैं इसे नोट कर लूंगा। :-)
जेसन बेकर

17

SQLAlchemy की घोषणात्मक विस्तार, जो 0.5 में मानक बन रहा है, सभी को एक इंटरफ़ेस में बहुत कुछ प्रदान करता है जैसे कि Django या Storm। यह डेटामैपर शैली का उपयोग करके कॉन्फ़िगर की गई कक्षाओं / तालिकाओं के साथ मूल रूप से एकीकृत करता है:

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

लेकिन चीजें बहुत जटिल हो जाती हैं अगर कई रिश्ते हों जैसे कि one_to_many, many_to_many, टेबल इनहेरिटेंस। आपको उन्हें संभालने के लिए बहुत सारे कोड हाथ से लिखने होंगे। त्वरित ओआरएम के लिए मेरे उत्तर की जांच करें। यह आपका समय बचा सकता है।
टायलर लॉन्ग

18
:) टायलर में SQLAlchemy के निर्माता को बता रहा है कि उसे क्विक ओआरएम का उपयोग करना चाहिए।
एंथोनी ब्रिग्स

5
:) मुझे याद दिलाता है कि कुछ साल पहले denr @ alice के साथ बहस करने पर वह वास्तव में सी। को नहीं समझ पाया था
पीटर रोवेल

@AnthonyBriggs, इस स्लाइड जांचने और quick_orm SQLAlchemy से जटिल संबंधों से निपटने में बेहतर है आप देखेंगे: slideshare.net/tyler4long/quickorm
टायलर लांग

10

हम SQLAlchemy के साथ अमृत ​​का उपयोग करते हैं और अब तक इसे पसंद कर चुके हैं। Elixir SQLAlchemy के ऊपर एक परत डालता है जो इसे "ActiveRecord पैटर्न" काउंटर भागों की तरह दिखता है।


2
SQLAlchemy बॉक्स के बाहर OOP और कार्यात्मक शैलियों का समर्थन करता है, इसके शीर्ष पर Elixir घोषणात्मक प्रोग्रामिंग शैली (ज्यादातर मॉडल घोषणाओं के लिए लेकिन इसे समाप्त किया जा सकता है) जोड़ता है।
मुहुर्त

5

यह पायथन में उच्च-स्तरीय डेटाबेस इंटरैक्शन के लिए विहित संदर्भ बिंदु लगता है: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

वहाँ से, यह Dejavu की तरह दिखता है मार्टिन फाउलर का DataMapper पैटर्न काफी संक्षेप में पायथन में है।


मुझे दिलचस्पी थी और देजावु को देखा। केवल थोड़ा सा। प्रलेखन बहुत विरल है (qoute "प्रस्तुति परत के लिए आप अपने दम पर हैं") तो केवल उन्नत उपयोगकर्ताओं के लिए मैं कहूंगा।
आर 4।

1

मुझे लगता है कि आप इसे देख सकते हैं:

पतझड़

आंधी


शरद ऋतु शायद तूफान से आसान है, लेकिन तूफान में कई विशेषताएं शामिल हैं जो शरद ऋतु में नहीं होती हैं। इन दोनों विकल्पों के पास सीमित दस्तावेज हैं, हालाँकि तूफान बहुत तेजी से ठीक हो रहा है!
alecwh

धन्यवाद, शरद ऋतु बहुत अच्छी और आकर्षक लगती है, लेकिन इसमें शून्य प्रलेखन है, जो मेरे लिए एक सौदा ब्रेकर है।
टेम्पो

1
मैंने बस शरद ऋतु पृष्ठ पर कुछ उदाहरणों की कोशिश की, और वे मेरे पैकेज प्रबंधक के कोड के संस्करण के साथ भी काम नहीं करते हैं। Google group में पोस्ट भी पुरानी हैं। ऐसा लगता है कि परियोजना धीमी मौत मर रही है। इसका उपयोग करने की अनुशंसा नहीं करेंगे।
जेसन Miesionczek

दूसरी ओर तूफान, तेजी से मेरी पसंद का ORM बन रहा है। डॉक्स बेहतर हो रहे हैं, और एपीआई स्वच्छ और सरल है, हालांकि मैं Django ORM द्वारा नियोजित ActiveRecord पैटर्न के लिए थोड़ा अधिक उपयोग किया जाता हूं, मुझे स्टॉर्म को नेविगेट करने में आसान लगता है।
जेसन Miesionczek

1
ऑटम के पास एक साल के लिए कोई गतिविधि नहीं है। group.google.com/group/autumn-orm
श्रीधर रत्नाकुमार

1

कोई भी अनुमान योग्य तरीका नहीं है कि Django में अप्रयुक्त विशेषताएं एक प्रदर्शन दंड देंगी। यदि आप कभी भी परियोजना को अपकमिंग करने का निर्णय लेते हैं तो बस काम आ सकता है।


8
वहाँ एक है concievable रास्ता
bukzor

0

मैंने एक छोटे से प्रोजेक्ट के लिए स्टॉर्म + SQLite का उपयोग किया, और जब तक मैंने मल्टीप्रोसेसिंग नहीं जोड़ा तब तक इससे बहुत खुश था। कई प्रक्रियाओं से डेटाबेस का उपयोग करने की कोशिश करने के परिणामस्वरूप "डेटाबेस लॉक किया गया" अपवाद है। मैंने SQLAlchemy पर स्विच किया, और उसी कोड ने बिना किसी समस्या के काम किया।


7
निष्पक्ष होने के लिए, SQLite वास्तव में समवर्ती अभिगम के लिए डिज़ाइन नहीं किया गया है।
Xiong Chiamiov

2
@ एक्सियन +1। SQLITE केवल एक फ़ाइल है, जिसमें कोई डेमॉन नहीं है।
ई-सिटिस

-1

SQLAlchemy बहुत, बहुत शक्तिशाली है। हालाँकि, यह थ्रेड सुरक्षित नहीं है, सुनिश्चित करें कि थ्रेड-पूल मोड में चेरी के साथ काम करते समय आप इसे ध्यान में रखें।


2
क्या यह सच है कि SQLAlchemy थ्रेडसेफ़ नहीं है? फिर इसका उपयोग WSGI पर पिरामिड ऐप्स में कैसे किया जाता है, जो मुख्य रूप से लोग थ्रेडेड मोड में तैनात हैं? इस विरोधाभासी बयान की कोई पुष्टि।
रवि कुमार

1
बेशक SQLAlchemy थ्रेड-सुरक्षित है।
मथायस उरलिचस

-7

मैं SQLAlchemy की जाँच करूँगा

इसका उपयोग करना वास्तव में आसान है और आपके द्वारा काम किए जाने वाले मॉडल बिल्कुल भी खराब नहीं हैं। Django, ORM के लिए SQLAlchemy का उपयोग करता है, लेकिन इसका उपयोग करके आप इसे पूरी शक्ति का उपयोग कर सकते हैं।

यहाँ 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')>

18
DjMO ORM के लिए sqlalchemy का उपयोग नहीं करता है । Sqlalchemy को एक वैकल्पिक ORM बनाने के लिए कुछ काम किए गए हैं, लेकिन यह पूरा नहीं हुआ है।
शेरबंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.