SQLAlchemy कोर - कई तालिकाओं का उपयोग करना

RDBMS की महत्वपूर्ण विशेषताओं में से एक तालिकाओं के बीच संबंध स्थापित करना है। SQL संचालन जैसे SELECT, UPDATE और DELETE को संबंधित तालिकाओं पर किया जा सकता है। यह अनुभाग SQLAlchemy का उपयोग करके इन ऑपरेशनों का वर्णन करता है।

इस प्रयोजन के लिए, हमारे SQLite डेटाबेस (College.db) में दो टेबल बनाए गए हैं। छात्रों की तालिका में वही संरचना है जो पिछले अनुभाग में दी गई है; जबकि पते की मेज हैst_id स्तंभ जिसे मैप किया गया है id column in students table विदेशी कुंजी का उपयोग करना।

निम्नलिखित कोड College.db में दो टेबल बनाएगा -

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

students = Table(
   'students', meta, 
   Column('id', Integer, primary_key = True), 
   Column('name', String), 
   Column('lastname', String), 
)

addresses = Table(
   'addresses', meta, 
   Column('id', Integer, primary_key = True), 
   Column('st_id', Integer, ForeignKey('students.id')), 
   Column('postal_add', String), 
   Column('email_add', String))

meta.create_all(engine)

उपरोक्त कोड छात्रों और पते की तालिका के लिए नीचे दिए गए प्रश्नों के लिए अनुवाद करेगा -

CREATE TABLE students (
   id INTEGER NOT NULL,
   name VARCHAR,
   lastname VARCHAR,
   PRIMARY KEY (id)
)

CREATE TABLE addresses (
   id INTEGER NOT NULL,
   st_id INTEGER,
   postal_add VARCHAR,
   email_add VARCHAR,
   PRIMARY KEY (id),
   FOREIGN KEY(st_id) REFERENCES students (id)
)

निम्नलिखित स्क्रीनशॉट उपरोक्त कोड को बहुत स्पष्ट रूप से प्रस्तुत करते हैं -

इन तालिकाओं को निष्पादित करके डेटा के साथ आबाद किया जाता है insert() methodटेबल ऑब्जेक्ट्स की। छात्रों की तालिका में 5 पंक्तियाँ डालने के लिए, आप नीचे दिए गए कोड का उपयोग कर सकते हैं -

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

conn = engine.connect()
students = Table(
   'students', meta, 
   Column('id', Integer, primary_key = True), 
   Column('name', String), 
   Column('lastname', String), 
)

conn.execute(students.insert(), [
   {'name':'Ravi', 'lastname':'Kapoor'},
   {'name':'Rajiv', 'lastname' : 'Khanna'},
   {'name':'Komal','lastname' : 'Bhandari'},
   {'name':'Abdul','lastname' : 'Sattar'},
   {'name':'Priya','lastname' : 'Rajhans'},
])

Rows निम्नलिखित कोड की मदद से पता तालिका में जोड़ा जाता है -

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
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)
)

conn.execute(addresses.insert(), [
   {'st_id':1, 'postal_add':'Shivajinagar Pune', 'email_add':'[email protected]'},
   {'st_id':1, 'postal_add':'ChurchGate Mumbai', 'email_add':'[email protected]'},
   {'st_id':3, 'postal_add':'Jubilee Hills Hyderabad', 'email_add':'[email protected]'},
   {'st_id':5, 'postal_add':'MG Road Bangaluru', 'email_add':'[email protected]'},
   {'st_id':2, 'postal_add':'Cannought Place new Delhi', 'email_add':'[email protected]'},
])

ध्यान दें कि पता तालिका में st_id कॉलम छात्रों के तालिका में आईडी कॉलम को संदर्भित करता है। अब हम दोनों तालिकाओं से डेटा लाने के लिए इस संबंध का उपयोग कर सकते हैं। हम लाना चाहते हैंname तथा lastname छात्रों की तालिका से पता तालिका में st_id के अनुरूप।

from sqlalchemy.sql import select
s = select([students, addresses]).where(students.c.id == addresses.c.st_id)
result = conn.execute(s)

for row in result:
   print (row)

चुनिंदा वस्तुएं प्रभावी ढंग से सामान्य अभिव्यक्ति पर दो तालिकाओं में शामिल होने वाली एसक्यूएल अभिव्यक्ति का अनुवाद करेगी -

SELECT students.id, 
   students.name, 
   students.lastname, 
   addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM students, addresses
WHERE students.id = addresses.st_id

यह दोनों तालिकाओं से संबंधित डेटा निकालने का उत्पादन निम्नानुसार करेगा -

(1, 'Ravi', 'Kapoor', 1, 1, 'Shivajinagar Pune', '[email protected]')
(1, 'Ravi', 'Kapoor', 2, 1, 'ChurchGate Mumbai', '[email protected]')
(3, 'Komal', 'Bhandari', 3, 3, 'Jubilee Hills Hyderabad', '[email protected]')
(5, 'Priya', 'Rajhans', 4, 5, 'MG Road Bangaluru', '[email protected]')
(2, 'Rajiv', 'Khanna', 5, 2, 'Cannought Place new Delhi', '[email protected]')