एक-पंक्ति अवलोकन:
का व्यवहार execute()
सभी मामलों में समान है, लेकिन वे 3 अलग-अलग विधियां हैं, इन Engine
, इन Connection
, और Session
कक्षाएं।
वास्तव में क्या है execute()
:
व्यवहार को समझने के लिए execute()
हमें Executable
कक्षा में देखने की जरूरत है । Executable
सभी "स्टेटमेंट" प्रकारों के लिए एक सुपरक्लास है, जिसमें सेलेक्ट (), डिलीट (), अपडेट (), इंसर्ट (), टेक्स्ट () - सरलतम शब्दों में संभव है, Executable
SQLAlchemy में समर्थित SQL अभिव्यक्ति कंस्ट्रक्शन है।
सभी मामलों में execute()
विधि SQL पाठ लेती है या SQL अभिव्यक्ति का निर्माण करती है अर्थात SQLAlchemy में समर्थित SQL अभिव्यक्ति निर्माणों की कोई भी विविधता और क्वेरी परिणाम लौटाती है ( ResultProxy
- DB-API
पंक्ति स्तंभों तक आसान पहुँच प्रदान करने के लिए कर्सर ऑब्जेक्ट को लपेटता है ।)
इसे और स्पष्ट करने के लिए (केवल वैचारिक स्पष्टीकरण के लिए, अनुशंसित दृष्टिकोण नहीं) :
Engine.execute()
(कनेक्शन रहित निष्पादन) के अलावा Connection.execute()
, और Session.execute()
, execute()
किसी भी Executable
निर्माण पर सीधे उपयोग करना भी संभव है । Executable
वर्ग के उसके अपने कार्यान्वयन है execute()
- आधिकारिक दस्तावेज के अनुसार, किस बारे में एक पंक्ति का वर्णन execute()
करता है "है संकलित करें और इस पर अमलExecutable
"। इस मामले में हमें Executable
किसी Connection
वस्तु या वस्तु के साथ (एसक्यूएल एक्सप्रेशन कंस्ट्रक्शन) को स्पष्ट रूप से बांधने की जरूरत होती है , Engine
(जिसे स्पष्ट रूप से एक Connection
वस्तु मिलती है ), इसलिए execute()
वसीयत को पता चल जाएगा कि कहां निष्पादित करना है SQL
।
निम्न उदाहरण इसे अच्छी तरह से प्रदर्शित करता है - नीचे दी गई तालिका के अनुसार:
from sqlalchemy import MetaData, Table, Column, Integer
meta = MetaData()
users_table = Table('users', meta,
Column('id', Integer, primary_key=True),
Column('name', String(50)))
स्पष्ट निष्पादन यानी Connection.execute()
- एसक्यूएल पाठ या निर्माण एसक्यूएल अभिव्यक्ति गुजर execute()
की विधि Connection
:
engine = create_engine('sqlite:///file.db')
connection = engine.connect()
result = connection.execute(users_table.select())
for row in result:
# ....
connection.close()
स्पष्ट संयोजन निष्पादन यानी Engine.execute()
- को सीधे एसक्यूएल पाठ या निर्माण एसक्यूएल अभिव्यक्ति गुजर execute()
इंजन की विधि:
engine = create_engine('sqlite:///file.db')
result = engine.execute(users_table.select())
for row in result:
# ....
result.close()
निहित निष्पादन यानी Executable.execute()
- भी कनेक्शन रहित है, और की execute()
विधि को कॉल करता है Executable
, अर्थात, यह execute()
सीधे SQL
अभिव्यक्ति निर्माण ( Executable
स्वयं का एक उदाहरण ) पर विधि कहता है।
engine = create_engine('sqlite:///file.db')
meta.bind = engine
result = users_table.select().execute()
for row in result:
# ....
result.close()
नोट: स्पष्टीकरण के उद्देश्य के लिए निहित निष्पादन का उदाहरण दिया गया - निष्पादन का यह तरीका अत्यधिक अनुशंसित नहीं है - डॉक्स के अनुसार :
"निहित निष्पादन" एक बहुत पुराना उपयोग पैटर्न है कि ज्यादातर मामलों में यह मददगार होने की तुलना में अधिक भ्रामक है, और इसके उपयोग को हतोत्साहित किया जाता है। दोनों पैटर्न एप्लिकेशन डिज़ाइन में समीचीन "शॉर्ट कट्स" के अति प्रयोग को प्रोत्साहित करते हैं जो आगे चलकर समस्याओं का कारण बनते हैं।
आपके सवाल:
जैसा कि मैं समझता हूं कि अगर कोई इंजन का उपयोग करता है। यह कनेक्शन बनाता है, सत्र खोलता है (कीमिया आपके बारे में परवाह करता है) और क्वेरी निष्पादित करता है।
आप इस भाग के लिए सही हैं "यदि कोई इसका उपयोग engine.execute
करता है connection
" लेकिन नहीं खुलता है, तो "खुलता है session
(कीमिया आपके बारे में परवाह करता है) और क्वेरी निष्पादित करता है" - का उपयोग करना Engine.execute()
और Connection.execute()
(लगभग) एक ही बात, औपचारिक रूप से, Connection
वस्तु अंतर्निहित रूप से निर्मित होती है , और बाद के मामले में हम स्पष्ट रूप से इसे तुरंत बताते हैं। वास्तव में इस मामले में क्या होता है:
`Engine` object (instantiated via `create_engine()`) -> `Connection` object (instantiated via `engine_instance.connect()`) -> `connection.execute({*SQL expression*})`
लेकिन क्या ऐसे कार्य करने के इन तीन तरीकों के बीच एक वैश्विक अंतर है?
DB लेयर पर यह बिल्कुल एक ही बात है, ये सभी SQL (टेक्स्ट एक्सप्रेशन या विभिन्न SQL एक्सप्रेशन कंस्ट्रक्शंस) को निष्पादित कर रहे हैं। आवेदन के दृष्टिकोण से दो विकल्प हैं:
- प्रत्यक्ष निष्पादन - उपयोग करना
Engine.execute()
याConnection.execute()
- का उपयोग करना
sessions
- कुशलता के माध्यम से आसानी से, एक इकाई के-कार्य के रूप में लेन-देन को संभालती है session.add()
, session.rollback()
,session.commit()
, session.close()
। यह ORM यानी मैप्ड टेबल के मामले में DB के साथ बातचीत करने का तरीका है। एकल अनुरोध के दौरान पहले से ही एक्सेस की गई या नई बनाई गई / जोड़ी गई वस्तुओं को तुरंत प्राप्त करने के लिए आइडेंटिटी_मैप प्रदान करता है ।
Session.execute()
Connection.execute()
SQL कथन निष्पादित करने के लिए अंततः कथन निष्पादन विधि का उपयोग करता है । Session
ऑब्जेक्ट का उपयोग करना SQLAlchemy ORM डेटाबेस के साथ बातचीत करने के लिए किसी एप्लिकेशन के लिए अनुशंसित तरीका है।
से एक अंश डॉक्स का :
यह नोट करना महत्वपूर्ण है कि SQLAlchemy ORM का उपयोग करते समय, इन वस्तुओं को आम तौर पर एक्सेस नहीं किया जाता है; इसके बजाय, सत्र ऑब्जेक्ट डेटाबेस के लिए इंटरफ़ेस के रूप में उपयोग किया जाता है। हालाँकि, उन अनुप्रयोगों के लिए, जिन्हें ORM के उच्च स्तरीय प्रबंधन सेवाओं में शामिल किए बिना शाब्दिक SQL कथनों और / या SQL अभिव्यक्ति के प्रत्यक्ष उपयोग के आसपास बनाया गया है, इंजन और कनेक्शन राजा (और रानी?) हैं - पर पढ़ें।