删除具有多对多关系的行

时间:2012-06-12 21:20:04

标签: python orm sqlalchemy

我有两个表,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_'

2 个答案:

答案 0 :(得分:0)

如果删除图像中的行,则应获取该图像ID。然后,您可以在关联表中删除图像ID ==您的图像ID。

答案 1 :(得分: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相同。