说我在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()
但我希望在没有循环的情况下这样做。
答案 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在后台进行清理,以确保根据您定义的任何其他关系规则,一切都是一致的。