2011-05-16 9 views
5

क्या ऑब्जेक्ट्स के बजाय ids का उपयोग करके एक स्क्लेक्लेमी रिलेशनशिप में जोड़ना संभव है?SQLAlchemy: ऑब्जेक्ट के बजाय आईडी का उपयोग करके एक रिश्ता जोड़ें?

उदाहरण के लिए, दो कथात्मक SQLAlchemy कक्षाएं, समीक्षा और कलाकार मानते हैं, उन दोनों के बीच एक संबंध के साथ: एक कलाकार को जोड़ने के लिए

class Review(Base): 
    artist_id = Column(Integer, ForeignKey('artist.id')) 
    artist = relationship(Artist, backref=backref('reviews', order_by=id)) 
    # etc. 

class Artist(Base): 
    # etc. 

समीक्षा आईडी की एक सूची के साथ, मैं ऊपर से देखने की जरूरत लगते हैं आईडी से कलाकार है, तो, समीक्षा करने के लिए कलाकार वस्तु को जोड़ने के इस तरह:

for review_id in review_ids: 
    review = session.query(Review).filter(Review.id==review_id).first() 
    artist.reviews.append(review) 

मुझे यकीन है कि इसे और अधिक देखने को छोड़ने के लिए और सिर्फ आईडी जोड़ने के कुशल होगा हूँ, लेकिन यह संभव है?

उत्तर

6

आपका सबसे अच्छा शर्त शायद समर्थन तालिकाओं के खिलाफ एक update अभिव्यक्ति की रचना करने के लिए है। अन्यथा, आप वास्तव में इसके लिए पूछे बिना Review वास्तव में संशोधित नहीं कर सकते हैं (और यही वह है जो आप कर रहे हैं; आप वास्तव में Artist को संशोधित नहीं कर रहे हैं)।

मान लिया जाये कि Review.id प्राथमिक कुंजी है, यही कारण है कि मोटे तौर पर होगा:

conn = session.connection() 
conn.execute(Review.__table__ 
       .update() 
       .values(artist_id=artist_id) 
       .where(Review.id.in_(review_ids)) 
      ) 
+0

शानदार, धन्यवाद। –

1

मुझे यकीन नहीं है कि मैं समझ गया हूं। मुझे लगता है कि आप कुछ इस तरह हैं:

reviews = session.query(Review).filter(Review.id.in_(review_ids)).all() 

artist.reviews.extend(reviews) 
+0

दरअसल मैं यही कर रहा हूं! मैंने एक सरल उदाहरण प्रदान करने के लिए उपरोक्त कोड लिखा था। यह अभी भी प्रत्येक सम्मिलन के लिए समीक्षा वस्तुओं को देख रहा है, जिसे मैं टालने की कोशिश कर रहा हूं। यद्यपि आपके सुझाव के लिए धन्यवाद। –

3

मुझे लगता है कि अगर आप शुद्ध ORM समाधान के साथ रहना चाहते हैं, आप कुछ हद तक अक्षम क्वेरी पैटर्न के साथ रहने के लिए होगा।

@ टोकनमैकगुय ने एक अच्छा विकल्प प्रदान किया है। आप add_reviews() को Artist() कक्षा में जोड़ कर उस दृष्टिकोण को एकीकृत कर सकते हैं। यह 'मानक' ओआरएम एपीआई बढ़ाएगा, ताकि आप स्थिति के आधार पर या तो उपयोग कर सकें।

from sqlalchemy.orm.session import object_session 

class Artist(Base): 
    def add_reviews(self, review_ids): 
     sess = object_session(self) 
     if isinstance(review_ids, int): review_ids = [review_ids] 
     sess.execute(
      Review.__table__ 
      .update() 
      .values(artist_id=self.artist_id) 
      .where(Review.id.in_(review_ids)) 
     ) 
     sess.refresh(self) 

review_ids = [123, 556, 998, 667, 111] 
artist.add_reviews(review_ids) 
review_id = 333 
artist.add_reviews(review_id) 
संबंधित मुद्दे