如何创建SQLAlchemy嵌套过滤器

时间:2014-06-01 14:23:39

标签: python postgresql sqlalchemy

说我在postgreSQL中有一个照片标记模式。

这很简单:

  • 用户有很多照片
  • 一张照片有很多标签

我正在使用SQL炼金术并尝试了解如何编写过滤器来查找和删除特定用户的所有照片的所有标记。

我知道如何查找用户的所有照片:

specific_user_id = "1234"
DBSession = sessionmaker(bind=engine)
s = DBSession()
q = s.query(Photo).filter(Photo.user_id == specific_user_id)
q.delete()

如何对此进行扩展以获取所有标记。我可以使用循环:

for photo in q.all():
    q2 = s.query(Tag).filter(Tag.photo_id == photo.photo_id) 
    q2.delete()

但我希望在没有循环的情况下这样做。

1 个答案:

答案 0 :(得分:1)

假设模型看起来像这样:

class Photo(Base):
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey(User.id), nullable=False)

    user = relationship(User, backref='photos')

class Tag(Base):
    id = Column(Integer, primary_key=True)
    photo_id = Column(Integer, ForeignKey(Photo.id), nullable=False)

    photo = relationship(Photo, backref='tags')

每个型号都有一个外键给他们的"所有者" (用户,照片),以及与该模型的关系。您可以在关系中编写带有连接的查询,以获取所有用户照片的所有标记。

tags = session.query(Tag).join(
    Tag.photo, Photo.user
).filter(User.id == specific_user_id)

for tag in tags:
    session.delete(tag)

session.commit()

使用session.delete代替query.delete,因为它允许SQLAlchemy在后台进行清理,以确保根据您定义的任何其他关系规则,一切都是一致的。