2011-05-16 3 views
5

개체가 아닌 ID를 사용하여 SQLAlchemy 관계에 추가 할 수 있습니까?SQLAlchemy : object 대신 id를 사용하여 관계를 추가 하시겠습니까?

예를 들어

는, 그들 사이의 관계와,이 개 선언 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의 목록으로, 나는 찾아 볼 필요가 것처럼 보이는

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

나는 조회를 생략하고 바로 ID를 추가하는 것이 더 효율적이 될 것이라고 확신 해요,하지만이 가능하다 : 아이디에서 아티스트, 다음과 같이 검토에 작가 개체를 추가?

답변

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

실제로 내가하는 일입니다. 위의 코드를 작성하여보다 간단한 예제를 제공했습니다. 그것은 여전히 ​​피하기 위해 각 인서트에 대한 Review 개체를 찾고 있습니다. 생각해 줘서 고마워. –

3

당신이 순수 ORM 솔루션을 고수 할 경우 내 생각, 당신은 다소 비효율적 인 쿼리 패턴과 함께 생활해야합니다.

@TokenMacGuy는 좋은 대안을 제공합니다. Artist() 클래스에 add_reviews()을 추가하여 이러한 접근 방식을 통합 할 수 있습니다. 이렇게하면 '표준'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) 
관련 문제