फ्लास्क- sqlalchemy या sqlalchemy


93

मैं फ्लास्क और स्केलेक्लेमी दोनों में नया हूं, मैं अभी एक फ्लास्क ऐप पर काम करना शुरू करता हूं, और मैं अभी के लिए स्क्वैल्सीम का उपयोग कर रहा हूं। मैं सोच रहा था कि क्या कोई महत्वपूर्ण लाभ मुझे फ्लास्क- sqlalchemy बनाम sqlalchemy का उपयोग करने से मिल सकता है। मुझे http://packages.python.org/Flask-SQLAlchemy/index.html में पर्याप्त प्रेरणाएँ नहीं मिलीं या शायद मुझे मूल्य समझ में नहीं आया !! मैं आपके स्पष्टीकरण की सराहना करूंगा।


6
हम्म, अभी भी यहाँ एक संतोषजनक जवाब नहीं है। क्या कोई समझा सकता है कि फ्लास्क ऐप में flask-sqlalchemyसादे पुराने से वास्तविक ठोस लाभ क्या हैं sqlalchemy?
स्टीव बेनेट

हालांकि एक बड़ा नुकसान यह है कि Flask-SqlAlchemyऐप में मल्टी-टेनेंसी सेटअप करने का कोई तरीका नहीं है। वह IMO सबसे बड़ा नकारात्मक है। bindsबशर्ते केवल अलग-अलग डेटाबेस को अलग-अलग मॉडल में संलग्न करना है, जबकि एक ही मॉडल के साथ किरायेदार-विशिष्ट डेटाबेस का उपयोग करने का कोई तरीका नहीं है।
रोहित जैन

जवाबों:


67

Flask-SQLAlchemyफ्लास्क एप्लिकेशन के साथ उचित एकीकरण की मुख्य विशेषता है - यह इंजन, कनेक्शन और सत्र बनाता है और इसे कॉन्फ़िगर करता है और फ्लास्क ऐप के साथ काम करने के लिए इसे कॉन्फ़िगर करता है।

यह सेटअप काफी जटिल है क्योंकि हमें स्कोप सत्र बनाने और फ्लास्क एप्लिकेशन अनुरोध / प्रतिक्रिया-जीवन चक्र के अनुसार इसे ठीक से संभालने की आवश्यकता है।

आदर्श दुनिया में यह एकमात्र विशेषता होगी Flask-SQLAlchemy, लेकिन वास्तव में इसमें कुछ और चीजें शामिल हैं। यहाँ उनके अवलोकन के साथ एक अच्छा ब्लॉग पोस्ट है: फ्लास्क-SQLAlchemy का प्रदर्शन

जब मैंने पहली बार फ्लास्क और SQLAlchemy के साथ काम किया, तो मुझे यह ओवरहेड पसंद नहीं आया। मैं गया और एक्सटेंशन से सत्र प्रबंधन कोड निकाला गया। यह दृष्टिकोण काम करता है, हालांकि मुझे पता चला कि इस एकीकरण को ठीक से करना काफी मुश्किल है।

तो आसान तरीका (जो मैं किसी अन्य परियोजना में उपयोग किया जाता है) को केवल ड्रॉप करने के लिए Flask-SQLAlchemyहै और जो भी अतिरिक्त सुविधाएँ प्रदान करता है उनमें से किसी का भी उपयोग न करें। आपके पास होगा db.sessionऔर आप इसका उपयोग कर सकते हैं जैसे कि यह शुद्ध SQLAlchemyसेटअप था ।


4
मैं उलझन में रहता हूं। लिंक किए गए ब्लॉग पोस्ट (और आधिकारिक डॉक्स!) कुछ सादे SQLAlchemy सुविधाओं (जैसे कि घोषणात्मक आधार) को सूचीबद्ध करते हैं जैसे कि वे फ्लास्क-SQLAlchemy विशेषताएं हैं; यह स्पष्ट नहीं है कि वे SQLAlchemy में निर्मित सामान का श्रेय ले रहे हैं या उन्होंने इसे फिर से लागू किया है (न ही उन्होंने ऐसा क्यों किया, यदि यह बाद की बात है)। आपका पहला पैराग्राफ दो विशेषताओं को सूचीबद्ध करता है: सत्र प्रबंधन के लिए सुविधा रैपर (लेकिन क्या आपको अपने स्वयं के रोल करने की आवश्यकता नहीं होगी यदि आप फ्लास्क के बाहर अपने SQLAlchemy मॉडल का उपयोग करना चाहते हैं ?) और कुछ अनिर्दिष्ट "कॉन्फ़िगरेशन" के साथ "फ्लैप ऐप के साथ काम करने के लिए "? । इसका क्या मतलब है ?
मार्क अमेरी

1
मैं भी सवालों से थोड़ा भ्रमित हूं। उदाहरण के लिए, लिंक किया गया ब्लॉग पोस्ट बहुत स्पष्ट IMO है, उदाहरण के लिए, यह कहता है "क्वेरी संपत्ति और पृष्ठांकन के लिए कस्टम घोषणात्मक आधार मॉडल" कुंजी "कस्टम" और "क्वेरी संपत्ति और पृष्ठांकन के समर्थन के साथ" है जो इसे शीर्ष पर जोड़ता है SQLAlchemy का घोषणात्मक आधार।
बोरिस सेरेब्रोव

1
"सुविधा रैपर" के बारे में - वे सुविधा के लिए नहीं हैं, लेकिन चीजों को ठीक से काम करने के लिए। SQLAlchemy का उपयोग करना शुरू करने के लिए आपको डेटाबेस कनेक्शन (eninge / कनेक्शन / सत्र) ऑब्जेक्ट्स की आवश्यकता होती है और आप हर बार जब आप SQL क्वेरी बनाने की आवश्यकता नहीं करते हैं, तो ये बनाना चाहते हैं, इसलिए इन्हें विश्व स्तर पर बनाया जाना चाहिए और एप्लिकेशन कोड में उपलब्ध होना चाहिए। तो आप "Yourapplication import db" से कुछ कर सकते हैं और फिर "db" ऑब्जेक्ट को ठीक से बनाने और शुरू करने के बारे में सोचने के बिना "db.session.something ()" करते हैं।
बोरिस सेरेब्रोव

और अनिर्दिष्ट "कॉन्फ़िगरेशन" के बारे में "फ्लास्क ऐप के साथ काम करने के लिए" - यह वास्तव में दूसरे पैराग्राफ में निर्दिष्ट है: This setup is quite complex as we need to create the scoped session and properly handle it according to the Flask application request/response life-cycle.SQLAlchemy डॉक्स में अधिक विवरण देखें: मैं एक सत्र का निर्माण कब करूं, मैं कब करूं, और कब करूं बंद करो? और प्रासंगिक / थ्रेड-स्थानीय सत्र
बोरिस सेरेब्रोव

20

सच कहूं, तो मुझे कोई लाभ नहीं दिखता। IMHO, फ्लास्क-SQLAlchemy एक अतिरिक्त परत बनाता है जिसकी आपको वास्तव में आवश्यकता नहीं है। हमारे मामले में हमारे पास ORM और Core दोनों का उपयोग करते हुए कई डेटाबेस / कनेक्शन (मास्टर-स्लेव) के साथ एक काफी जटिल फ्लास्क एप्लिकेशन है, जहां अन्य बातों के अलावा, हमें अपने सत्र / DB लेनदेन (जैसे ड्राईरन बनाम प्रतिबद्ध मोड) को नियंत्रित करने की आवश्यकता है। फ्लास्क- SQLAlchemy कुछ अतिरिक्त कार्यक्षमता को जोड़ता है जैसे कि सत्र का स्वत: विनाश आपके लिए कुछ चीजें ग्रहण करता है जो बहुत बार ऐसा नहीं है जो आपको चाहिए।


5
हां, आपके उपयोग के मामले में फ्लास्क-एसक्यूएलकेमी अप्रचलित है। लेकिन अगर ओपी के पास ऐसा परिदृश्य होगा तो वह शायद यह सवाल नहीं पूछेगा। एक नए उपयोगकर्ता के लिए जो सत्र गुंजाइश के बारे में कुछ भी नहीं जानता है फ्लास्क-एसक्यूएलचेमी निश्चित रूप से एक जरूरी है!
श्लमर sch

20

फ्लास्क- SQLAlchemy आपको कई अच्छे अतिरिक्त देता है, जो आप SQLAlchemy का उपयोग करके खुद को लागू करते हैं।

फ्लास्क-SQLAlchemy का उपयोग करने पर सकारात्मक पक्ष


  1. Flask_SQLAlchemy आपके लिए सत्र विन्यास, सेटअप और अशांति को संभालता है।
  2. आपको घोषणात्मक आधार मॉडल देता है जो क्वेरी और पृष्ठांकन को आसान बनाता है
  3. विशिष्ट सेटिंग्स का बैकएंड करें ।lask-SQLAlchemy स्कैन ने यूनिकोड समर्थन के लिए इंस्टॉल किए गए कामों को स्थापित किया और यदि विफल हो जाता है तो SQLAlchemy यूनिकोड का उपयोग करता है।
  4. नामक विधि है apply_driver_hacks जो स्वचालित रूप से MySQL पूल-आकार की तरह थिग्स को साने डिफॉल्ट सेट करती है
  5. सभी तालिकाओं को बनाने और छोड़ने के लिए create_all () और drop_all () विधियों में अच्छा निर्माण किया है। परीक्षण के लिए और अजगर कमांड लाइन में उपयोगी है अगर आपने कुछ बेवकूफ किया है
  6. यह आपको get_or_404 () के बजाय get () और find_or_404 () खोजने के बजाय देता है () कोड उदाहरण पर> http://flask-sqlalchemy.pocoo.org/2.1/queries/

स्वचालित रूप से तालिका नाम सेट करें। फ्लास्क-एसक्यूएलचेमी स्वचालित रूप से आपकी तालिका को आपके ClassName> नाम परिवर्तित करके सेट करता है class_nameयह सेटिंग द्वारा ओवरराइड किया जा सकता है__tablename__ वर्ग सूची आइटम

फ्लास्क-SQLAlchemy का उपयोग करने पर नकारात्मक पक्ष


  1. फ्लास्क- SQLAlchemy का उपयोग करना फ्लास्क से माइग्रेट करने के लिए अतिरिक्त कठिनाइयों को जोड़ देगा, ताकि अगर आप चाहते हैं तो पिरामिड कह सकें। यह मुख्य रूप से Flask_SQLAchemy पर कस्टम घोषणात्मक आधार मॉडल के कारण है।
  2. फ्लास्क- SQLAlchemy का उपयोग करके आप SQLAlchemy की तुलना में बहुत छोटे समुदाय के साथ एक पैकेज का उपयोग करने का जोखिम उठाते हैं, जिसे मैं जल्द ही किसी भी समय सक्रिय विकास से आसानी से नहीं हटा सकता।
  3. कुछ अच्छे एक्स्ट्रा कलाकार फ्लास्क-SQLAlchemy आपको भ्रमित कर सकते हैं यदि आप नहीं जानते कि वे वहां हैं।

15

SQLAlchemy प्रलेखन स्पष्ट रूप से बताता है कि आपको फ्लास्क-SQLAlchemy का उपयोग करना चाहिए (विशेषकर यदि आप इसके लाभों को समझते हैं!):

[...] उत्पाद जैसे फ्लास्क-एसक्यूएलकेमी [...] SQLAlchemy दृढ़ता से अनुशंसा करता है कि इन उत्पादों को उपलब्ध के रूप में उपयोग किया जाए।

यह उद्धरण और एक विस्तृत प्रेरणा आप सत्र सामान्य प्रश्न के दूसरे प्रश्न में पा सकते हैं ।


2
फ्लास्क-स्क्लैल्केमी को अप्राप्य लगता है। आखिरी अपडेट 2013 के 1 अगस्त को था। क्या यह सलाह किसी भी अधिक प्रासंगिक है?
pmav99

@ pmav99 जब तक आपके पास इसके ठोस मुद्दे नहीं हैं, तब भी मैं इसकी सिफारिश करूंगा, खासकर नए उपयोगकर्ताओं के लिए।
शलमर

1
नवंबर 2014 तक सक्रिय रूप से बनाए रखा जाना चाहिए। हाल ही में बहुत सारे हैं। github.com/mitsuhiko/flask-sqlalchemy/commits/master
स्टीव बेनेट

25
भले ही ओपी ने सीधे तौर पर यह न पूछा हो, इमो। वह फ्लास्क-SQLAlchemy के लाभों को जानना चाहता था। आपका उत्तर शाब्दिक है "इसका उपयोग करें भले ही आपको पता न हो कि क्या लाभ हैं" - हाँ, क्या लाभ हैं?
मार्कस मेस्कैनन

1
यह जवाब ओपी के सवाल का जवाब नहीं देता है। आप अनुशंसा के पीछे बहुत तर्क प्रदान करते हुए, फ्लास्क-स्केलेक्लेमी की सिफारिश कर रहे हैं।
मबदावी

7

जैसा कि @schlamar बताता है कि फ्लास्क- SqlAlchemy एक अच्छी बात है। आईडी केवल वहां बने बिंदु पर कुछ अतिरिक्त संदर्भ जोड़ना चाहते हैं।

ऐसा महसूस न करें कि आप एक दूसरे को चुन रहे हैं। उदाहरण के लिए, हम फ्लास्क-स्क्लेक्लेमी का उपयोग करते हुए एक मॉडल का उपयोग करते हुए तालिका से सभी रिकॉर्ड हथियाना चाहते हैं। यह जितना सरल है

Model.query.all()

बहुत से साधारण मामलों के लिए फ्लास्क-स्क्लेक्लेमी पूरी तरह से ठीक है। अतिरिक्त बिंदु जो मैं बनाना चाहूंगा, यदि फ्लास्क-स्क्लेक्लेमी वह नहीं है जो आप करना चाहते हैं, तो कोई कारण नहीं है कि आप सीधे स्क्लेक्लेमी का उपयोग नहीं कर सकते।

from myapp.database import db

num_foo = db.session.query(func.count(OtherModel.id)).filter(is_deleted=False).as_scalar()

db.session.query(Model.id, num_foo.label('num_foo')).order_by('num_foo').all()

जैसा कि आप देख सकते हैं कि हम बिना किसी परेशानी के एक से दूसरे में आसानी से कूद सकते हैं और दूसरे उदाहरण में हम वास्तव में फ्लास्क-स्क्लेक्लेमी परिभाषित मॉडल का उपयोग कर रहे हैं।


1
"उदाहरण के लिए हम कहते हैं कि हम फ्लास्क-स्क्लेक्लेमी का उपयोग करके एक मॉडल से तालिका से सभी रिकॉर्ड को हथियाना चाहते हैं। यह उतना ही सरल है Model.query.all()" - यह सब सिर्फ SQLAlchemy के साथ किया जा सकता है , फ्लास्क- SQLAlchemy का उपयोग करके यहां बिल्कुल कुछ भी नया नहीं मिलता है।
मार्कस मेस्कैनन

आप कमाल के है! मैं इस पोस्ट पर लड़खड़ा गया और इसने एक समस्या हल कर दी जो मुझे हो रही थी। एनाकोंडा लगाने के बाद, किसी कारण से सामान्य अपडेट काम नहीं कर रहे थे। से बदल Model.query.all()करने के लिए db.session.query(Model).all()किसी कारण सत्र नज़र रखने की अनुमति है और सामान्य रूप में अद्यतन के लिए।
जेफ ब्लूमेल

2

यहाँ एक लाभ का एक उदाहरण है फ्लास्क- sqlalchemy आपको सादे sqlalchemy पर देता है।

मान लीजिए कि आप फ्लास्क_यूज़र का उपयोग कर रहे हैं।

flask_user उपयोगकर्ता ऑब्जेक्ट के निर्माण और प्रमाणीकरण को स्वचालित करता है, इसलिए इसे आपके डेटाबेस तक पहुंचने की आवश्यकता है। उपयोगकर्ता द्वारा कॉल करने पर कक्षा "उपयोगकर्ता" नामक एक "एडेप्टर" कहलाता है जो डेटाबेस कॉल को अमूर्त करता है। आप UserManager निर्माता में एक एडेप्टर प्रदान करते हैं, और एडॉप्टर को इन कार्यों को लागू करना चाहिए:

class MyAdapter(DBAdapter):
    def get_object(self, ObjectClass, id):
        """ Retrieve one object specified by the primary key 'pk' """
        pass

    def find_all_objects(self, ObjectClass, **kwargs):
         """ Retrieve all objects matching the case sensitive filters in 'kwargs'. """
        pass


    def find_first_object(self, ObjectClass, **kwargs):
        """ Retrieve the first object matching the case sensitive filters in 'kwargs'. """
        pass

    def ifind_first_object(self, ObjectClass, **kwargs):
        """ Retrieve the first object matching the case insensitive filters in 'kwargs'. """
        pass

    def add_object(self, ObjectClass, **kwargs):
        """ Add an object of class 'ObjectClass' with fields and values specified in '**kwargs'. """
        pass

    def update_object(self, object, **kwargs):
        """ Update object 'object' with the fields and values specified in '**kwargs'. """
        pass

    def delete_object(self, object):
        """ Delete object 'object'. """
        pass

    def commit(self):
        pass

यदि आप फ्लास्क- sqlalchemy का उपयोग कर रहे हैं, तो आप अंतर्निहित SQLAlchemyAdapter का उपयोग कर सकते हैं। यदि आप sqlalchemy (नहीं-फ्लास्क-sqlalchemy) का उपयोग कर रहे हैं, तो आप उस तरीके के बारे में अलग-अलग धारणाएं बना सकते हैं, जिसमें ऑब्जेक्ट डेटाबेस में सहेजे जाते हैं (तालिकाओं के नामों की तरह) ताकि आपको अपना एडेप्टर वर्ग लिखना पड़े।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.