gpt4 book ai didi

python - 如何创建 SQLAlchemy 嵌套过滤器

转载 作者:行者123 更新时间:2023-11-29 12:21:04 25 4
gpt4 key购买 nike

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

很简单:

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

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

我知道如何找到一个用户的所有照片:

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()

但我希望在没有循环的情况下执行此操作。

最佳答案

假设模型看起来像这样:

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 在后台清理以确保根据您定义的任何其他关系规则一切都是一致的.

关于python - 如何创建 SQLAlchemy 嵌套过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23980833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com