2012-06-12 27 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,首先指向它的所有行。我該怎麼做呢?

我嘗試這樣做:

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

哪裏image是我要刪除的行,但我得到這個錯誤:

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

你有沒有嘗試設置圖像和image_assoc之間的關係刪除孤兒級聯? [see here](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),然後刷新,這就是你需要刪除images_assoc中的行。 – zzzeek

回答

0

如果刪除圖像的行,你應該得到的是圖片ID。然後你可以刪除你的圖片id ==你的圖片ID。

+0

我甚至無法做到這一點。我更新了我的帖子,以顯示我嘗試過的內容。 –

0

問題在於SA沒有跟蹤餐廳和圖片側面之間的關係,因此它「不知道」存在依賴關係。只要從另一側配置關係,關聯表中的相應行也將自動刪除。爲了增加關係的另一面是不夠的,只是使用backref

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

,但你也可以定義那些明確每個對象(back_populates需要在這種情況下):

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相同。