sqlachemy:按关系过滤(如Django orm)?

时间:2018-10-30 11:01:18

标签: python django-models sqlalchemy

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用any() and has()根据非标量和标量关系进行过滤。它们产生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子查询表达式的性能可能较差。