SQLAlchemy ORM - संबंध बनाना

इस सत्र में एक अन्य तालिका के निर्माण का वर्णन किया गया है जो हमारे डेटाबेस में पहले से मौजूद है। ग्राहकों की तालिका में ग्राहकों का मास्टर डेटा होता है। अब हमें इनवॉयस टेबल बनाने की आवश्यकता है जिसमें किसी भी ग्राहक के चालान की संख्या हो सकती है। यह एक से कई रिश्तों का मामला है।

घोषणात्मक का उपयोग करते हुए, हम इस तालिका को इसके मैप किए गए वर्ग के साथ परिभाषित करते हैं, चालान नीचे दिए गए अनुसार -

from sqlalchemy import create_engine, ForeignKey, Column, Integer, String
engine = create_engine('sqlite:///sales.db', echo = True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy.orm import relationship

class Customer(Base):
   __tablename__ = 'customers'

   id = Column(Integer, primary_key = True)
   name = Column(String)
   address = Column(String)
   email = Column(String)

class Invoice(Base):
   __tablename__ = 'invoices'
   
   id = Column(Integer, primary_key = True)
   custid = Column(Integer, ForeignKey('customers.id'))
   invno = Column(Integer)
   amount = Column(Integer)
   customer = relationship("Customer", back_populates = "invoices")

Customer.invoices = relationship("Invoice", order_by = Invoice.id, back_populates = "customer")
Base.metadata.create_all(engine)

यह नीचे के रूप में SQLite इंजन के लिए एक सृजन तालिका क्वेरी भेजेगा -

CREATE TABLE invoices (
   id INTEGER NOT NULL,
   custid INTEGER,
   invno INTEGER,
   amount INTEGER,
   PRIMARY KEY (id),
   FOREIGN KEY(custid) REFERENCES customers (id)
)

हम जाँच सकते हैं कि SQLiteStudio टूल की मदद से Sales.db में नई तालिका बनाई गई है।

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

एक दूसरा निर्देश, जिसे रिश्ते के रूप में जाना जाता है (), ORM को बताता है कि इनवॉइस क्लास को विशेषता इनवॉइस कस्टमर का उपयोग करके ग्राहक वर्ग से जोड़ा जाना चाहिए। संबंध () इस संबंध की प्रकृति का निर्धारण करने के लिए दो तालिकाओं के बीच विदेशी कुंजी संबंधों का उपयोग करता है, यह निर्धारित करता है कि यह एक से कई है।

एक अतिरिक्त संबंध () निर्देश ग्राहक मैप्ड क्लास पर विशेषता Customer.invoices के तहत रखा गया है। पैरामीटर संबंध.बैक_पॉप्स को पूरक विशेषता नामों का उल्लेख करने के लिए सौंपा गया है, ताकि प्रत्येक संबंध () रिवर्स में व्यक्त किए गए समान संबंध के बारे में बुद्धिमान निर्णय ले सकें। एक तरफ, Invoices.customer चालान उदाहरणों को संदर्भित करता है, और दूसरी तरफ, Customer.invoices ग्राहक उदाहरणों की एक सूची को संदर्भित करता है।

संबंध फ़ंक्शन SQLAlchemy ORM पैकेज के रिलेशनशिप API का एक हिस्सा है। यह दो मैप किए गए वर्गों के बीच एक संबंध प्रदान करता है। यह माता-पिता-बच्चे या सहयोगी तालिका संबंध से मेल खाती है।

निम्नलिखित बुनियादी संबंध पैटर्न पाए जाते हैं -

अनेको के लिये एक

एक से कई संबंध बच्चे की मेज पर एक विदेशी कुंजी की मदद से माता-पिता को संदर्भित करते हैं। संबंध () तब माता-पिता पर निर्दिष्ट किया जाता है, जैसा कि बच्चे द्वारा प्रस्तुत वस्तुओं के संग्रह को संदर्भित करता है। रिलेशनशिप.बैक_पॉप्लेट्स पैरामीटर को एक-से-कई में एक द्विदिश संबंध स्थापित करने के लिए उपयोग किया जाता है, जहां "रिवर्स" पक्ष कई से एक है।

एक से कई

दूसरी ओर, कई टू वन रिलेशनशिप बच्चे को संदर्भित करने के लिए पेरेंट टेबल में एक विदेशी कुंजी लगाते हैं। संबंध () माता-पिता पर घोषित किया जाता है, जहां एक नई स्केलर-होल्डिंग विशेषता बनाई जाएगी। यहाँ फिर से relationship.back_populates पैरामीटर का उपयोग बिडायरेनिअलबेहेवियर के लिए किया जाता है।

एक से एक

वन टू वन रिलेशनशिप अनिवार्य रूप से प्रकृति में एक द्विदिश संबंध है। Uselist झंडा रिश्ते के "कई" पक्ष पर एक संग्रह के बजाय एक स्केलर विशेषता के स्थान को इंगित करता है। वन-टू-वन को एक-से-एक प्रकार के संबंध में बदलने के लिए, uselist पैरामीटर को गलत पर सेट करें।

कई कई

कई से कई संबंध उनकी विदेशी चाबियों के साथ विशेषताओं को परिभाषित करके दो वर्गों से संबंधित एक संघ तालिका को जोड़कर स्थापित किया जाता है। यह संबंध के माध्यमिक तर्क द्वारा इंगित किया गया है ()। आमतौर पर, टेबल डिक्लेक्टिव बेस क्लास से जुड़ी मेटाडेटा ऑब्जेक्ट का उपयोग करता है, ताकि फॉरेनके के निर्देश रिमोट टेबल का पता लगा सकें जिसके साथ लिंक करना है। प्रत्येक रिश्ते के लिए रिलेशनशिप .बैक_पोपलेट्स पैरामीटर () एक द्विदिश संबंध स्थापित करता है। रिश्ते के दोनों पक्षों में एक संग्रह होता है।