首页 > 解决方案 > sqlachemy:按关系过滤(如django orm)?

问题描述

在 django ORM 中,您可以直接按关系属性进行过滤。例如,给定表格

class Product(models.Model):
    product_id = models.IntegerField(primary_key=True)
    color = models.TextField()

class Sale(models.Model):
    sale_id = models.IntegerField(primary_key=True)
    timestamp = models.DateTimeField()
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

你可以做

Sale.objects.filter(product__color__in=['red', 'blue'])

甚至反过来

Product.objects.filter(sale__timestamp__gt=datetime.now())

在没有显式 JOIN的情况下,在 sqlalchemy 中执行此操作的正确方法是什么?

标签: pythondjango-modelssqlalchemy

解决方案


您可以使用any()andhas()来基于非标量和标量关系进行过滤。它们产生 EXISTS 子查询表达式:

session.query(Product).filter(Product.sales.any(Sale.timestamp > datetime.now()))

session.query(Sale).filter(Sale.product.has(Product.color.in_(['red', 'blue'])))

不幸的是,与使用显式连接相比,在某些 DBMS 上,EXISTS 子查询表达式可能表现不佳。


推荐阅读