python - 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 中执行此操作的正确方法是什么?
解决方案
您可以使用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 子查询表达式可能表现不佳。
推荐阅读
- python - 如何使用 MagickImage/Wand 在 Python 中创建由等距边框文本框组成的图像
- reactjs - Redux Saga 在任何错误后都不起作用。它完全停止工作,需要刷新页面
- python - 如何在 discord.py 中输入命令
- javascript - 有什么办法可以缩短这段代码?目前它工作正常
- email - 获取 gmail 或任何其他电子邮件提供商的邮件数据
- excel - 当特定文本在另一列中时如何突出显示列中具有相同值的所有单元格
- javascript - 如何使用@emotion/native 有条件地设置 CSS 属性(文本装饰线和/或边框底部宽度)?
- react-native - React Navigator 5 Stack“组件”不返回任何内容
- flutter - 颤振模拟器没有运行
- c++ - 在 SFML for C++ 中使用多线程的问题