2012-06-12 3 views
0

imagerestaurant의 두 테이블이 있습니다. 저는 그들 사이에 다 대다 관계를 설정했습니다. 여기 다 - 대 - 다 관계가있는 행 삭제

는 테이블 정의의 관련 부분은 다음과 같습니다

images_assoc = Table('restaurant_image_assoc', Base.metadata, 
     Column('restaurant', Integer(unsigned=True), 
      ForeignKey('restaurant.id')), 
     Column('image', Integer(unsigned=True), 
      ForeignKey('image.id'))) 

class Image(Base): 
    __tablename__ = 'image' 
    id = Column(Integer(unsigned=True), primary_key=True) 
    reports = Column(TinyInt, nullable=False, default=0) 
    created_at = Column(DateTime, default=datetime.now) 

class Restaurant(Base): 
    __tablename__ = 'restaurant' 
    id = Column(Integer(unsigned=True), primary_key=True) 
    images = relationship(Image, secondary=images_assoc) 

내가 image에서 행을 삭제해야하지만, 물론 내가 먼저 가리 restaurant_image_assoc의 모든 행을 삭제해야합니다. 어떻게해야합니까?

나는이 시도 : 당신이 이미지의 행을 삭제하면

AttributeError: 'Table' object has no attribute 'class_' 
+0

image와 image_assoc 사이의 관계에 delete-orphan cascade를 설정해 보았습니까? [여기를 보시오] (http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#unitofwork-cascades) – urschrei

+0

아무 관계도 없으며, 하나를 만들려고 할 때 나에게 소리 지르기 시작합니다. 나는 현재 원시 SQL을 사용하여 함께 작업하는 것을 해킹했습니다. >. < –

+0

여기서 특정 오류 메시지는 Query()가 현재 테이블 (query (images_assoc) ... delete())과 작동하지 않는다는 것입니다. 그래도 다른 답변과 마찬가지로 Restaurant.images를 조작하면 images_assoc의 행이 자동으로 처리됩니다. "보조"이므로 캐스케이드 설정에 관계 없습니다. 즉, restaurant.images.remove (some_image)라고 말한 다음 flush하면 images_assoc에서 행을 삭제하기 만하면됩니다. – zzzeek

답변

0

, 당신은 것을 얻어야한다 : image 내가 삭제하려는 행이,하지만 난이 오류가

request.db.query(images_assoc)\ 
     .filter(images_assoc.c.image==image.id).delete() 
request.db.delete(image) 
request.db.commit() 

이미지 ID. 그런 다음 이미지 ID == 이미지 ID를 assoc 테이블에서 삭제할 수 있습니다.

+0

나는 그렇게 할 수 없습니다. 나는 내가 시도한 것을 보여주기 위해 내 글을 업데이트했다. –

0

문제는 SA가 이미지 측면에서 Restaurant과 Image 간의 관계를 추적하지 않기 때문에 종속성이 있다는 것을 "모른다"는 것입니다. 다른 쪽에서 관계를 구성하는 즉시 연관 테이블의 각 행이 자동으로 삭제됩니다. (back_populates이 경우 필요)

class Restaurant(Base): 
    images = relationship(Image, secondary=images_assoc, backref="restaurants") 

하지만 당신은 또한 각 개체에 명시 적으로 사람들을 정의 할 수 있습니다 : : 관계의 다른면을 추가하려면 단순히 backref을 사용하기에 충분

class Image(Base): 
    restaurants = relationship("Restaurant", secondary=images_assoc, back_populates="images") 
class Restaurant(Base): 
    images = relationship(Image, secondary=images_assoc, back_populates="restaurants") 

그러나 후자는 의미 상으로 backref을 사용하는 것과 같습니다.