2011-05-16 50 views
5

是否可以使用ids而不是對象添加到SQLAlchemy關係?SQLAlchemy:使用id而不是object添加關係?

例如,考慮兩個聲明的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. 

隨着審覈ID列表添加到一個藝術家,我似乎需要仰視的從ID的藝術家,那麼藝術家對象添加到審查,就像這樣:

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

我敢肯定,這將是更有效地跳過查找,只需添加的ID,但是這可能嗎?

回答

6

您最好的選擇可能是對組合的支持表的update表達。否則,如果沒有實際查詢Review,則無法真正修改Review(這就是您的所作所爲;您實際上並未修改Artist)。

假設Review.id是主鍵,這將大致是:

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

輝煌,謝謝。 – 2011-05-18 09:09:01

1

我不確定我是否理解。我想你想是這樣的:

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

artist.reviews.extend(reviews) 
+0

其實這就是我正在做的!我編寫了上面的代碼來提供一個更簡單的例子。它仍在爲每個插入查找Review對象,我試圖避免這種情況。儘管感謝您的建議。 – 2011-05-17 08:56:38

3

我認爲,如果你想堅持純粹的ORM解決方案,你將不得不住在一起有點低效的查詢模式。

@TokenMacGuy提供了一個很好的選擇。您可以通過將add_reviews()添加到Artist()類來整合該方法。這會增加'標準'orm api,所以你可以根據情況使用。

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) 
相關問題