SQLAlchemy कोर - सेट संचालन का उपयोग करना

पिछले अध्याय में, हमने विभिन्न कार्यों जैसे कि अधिकतम (), मिनट (), गिनती (), आदि के बारे में सीखा है, यहाँ, हम सेट संचालन और उनके उपयोगों के बारे में जानेंगे।

UNION और INTERSECT जैसे सेट ऑपरेशन मानक SQL और इसकी अधिकांश बोली द्वारा समर्थित हैं। SQLAlchemy निम्नलिखित कार्यों की मदद से उन्हें लागू करता है -

संघ ()

दो या अधिक चयनित बयानों के परिणामों के संयोजन के दौरान, UNION परिणाम से डुप्लिकेट को समाप्त करता है। कॉलम और डेटाटाइप की संख्या दोनों तालिकाओं में समान होनी चाहिए।

संघ () फ़ंक्शन कई तालिकाओं से एक CompoundSelect ऑब्जेक्ट देता है। निम्नलिखित उदाहरण इसके उपयोग को प्रदर्शित करता है -

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, union
engine = create_engine('sqlite:///college.db', echo = True)

meta = MetaData()
conn = engine.connect()
addresses = Table(
   'addresses', meta, 
   Column('id', Integer, primary_key = True), 
   Column('st_id', Integer), 
   Column('postal_add', String), 
   Column('email_add', String)
)

u = union(addresses.select().where(addresses.c.email_add.like('%@gmail.com addresses.select().where(addresses.c.email_add.like('%@yahoo.com'))))

result = conn.execute(u)
result.fetchall()

संघ एसक्यूएल अभिव्यक्ति का अनुसरण करने के लिए अनुवाद का निर्माण करता है -

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? UNION SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ?

हमारे पते तालिका से, निम्नलिखित पंक्तियाँ यूनियन ऑपरेशन का प्रतिनिधित्व करती हैं -

[
   (1, 1, 'Shivajinagar Pune', '[email protected]'),
   (2, 1, 'ChurchGate Mumbai', '[email protected]'),
   (3, 3, 'Jubilee Hills Hyderabad', '[email protected]'),
   (4, 5, 'MG Road Bangaluru', '[email protected]')
]

union_all ()

UNION सभी ऑपरेशन डुप्लिकेट को निकाल नहीं सकते हैं और परिणाम में डेटा को सॉर्ट नहीं कर सकते हैं। उदाहरण के लिए, उपरोक्त क्वेरी में, UNION को प्रभाव देखने के लिए UNION ALL द्वारा प्रतिस्थापित किया जाता है।

u = union_all(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.email_add.like('%@yahoo.com')))

इसी SQL अभिव्यक्ति निम्नानुसार है -

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? UNION ALL SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ?

के सिवाय_()

एसक्यूएल EXCEPTक्लॉज / ऑपरेटर का उपयोग दो सेलेक्ट स्टेटमेंट को मिलाने और पहले सेलेक्ट स्टेटमेंट से पंक्तियों को वापस करने के लिए किया जाता है जो दूसरे सेलेक्ट स्टेटमेंट द्वारा वापस नहीं किए जाते हैं। अपवाद_ () फ़ंक्शन EXCEPT क्लॉज़ के साथ एक SELECT अभिव्यक्ति उत्पन्न करता है।

निम्नलिखित उदाहरण में, अपवाद_ () फ़ंक्शन केवल उन पतों को पते की तालिका से वापस करता है जिनके पास ईमेल_एडीडी फ़ील्ड में 'gmail.com' है, लेकिन उन लोगों को बाहर करता है जिनके पास पोस्टल_एड फ़ील्ड के भाग के रूप में 'पुणे' है।

u = except_(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.postal_add.like('%Pune')))

उपरोक्त कोड का परिणाम निम्नलिखित एसक्यूएल अभिव्यक्ति है -

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? EXCEPT SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.postal_add LIKE ?

यह मानते हुए कि पते तालिका में पहले के उदाहरणों में उपयोग किया गया डेटा है, यह निम्न आउटपुट प्रदर्शित करेगा -

[(2, 1, 'ChurchGate Mumbai', '[email protected]'),
   (3, 3, 'Jubilee Hills Hyderabad', '[email protected]')]

एक दूसरे को काटना ()

INTERSECT ऑपरेटर का उपयोग करते हुए, SQL दोनों SELECT स्टेटमेंट में से आम पंक्तियों को प्रदर्शित करता है। प्रतिच्छेदन () फ़ंक्शन इस व्यवहार को लागू करता है।

निम्नलिखित उदाहरणों में, दो SELECT कन्स्ट्रक्ट्स प्रतिच्छेद () फ़ंक्शन के पैरामीटर हैं। एक ईमेल_add कॉलम के हिस्से के रूप में 'gmail.com' वाली पंक्तियाँ देता है, और अन्य रिटर्न पंक्तियाँ जिनके पास post__dd कॉलम के भाग के रूप में 'पुणे' है। परिणाम दोनों परिणामों से सामान्य पंक्तियाँ होंगी।

u = intersect(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.postal_add.like('%Pune')))

वास्तव में, यह SQL कथन का अनुसरण करने के बराबर है -

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? INTERSECT SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.postal_add LIKE ?

नीचे दिए गए पते के रूप में दो बाध्य पैरामीटर '% gmail.com' और '% पुणे' मूल डेटा से एकल पंक्ति उत्पन्न करते हैं -

[(1, 1, 'Shivajinagar Pune', '[email protected]')]