使用sqlalchemy,如何按关联对象属性和正则罚款



使用any()方法,我能够像这样过滤查询:

session.query(Result).filter(Result.related_images.any(url='result1_1512149119.jpg'))

这是针对与Result类相关的图像过滤的,该类别与由协会对象ResultImages定义的Image对象有关系,因此session.query(Result.related_images).all()将返回所有已指定为与Result条目相关的图像。

从上方进行第一次查询时,我会得到以下输出:

result1_1512149091.jpg
result1_1512149094.jpg
result1_1512149097.jpg
result1_1512149100.jpg
result1_1512149103.jpg
result1_1512149105.jpg
result1_1512149109.jpg
result1_1512149111.jpg
result1_1512149113.jpg
result1_1512149117.jpg
result1_1512149119.jpg
result1_1512149122.jpg
result1_1512149125.jpg
result1_1512149128.jpg

在我的数据库中,有许多图像可用于许多结果,因此以下查询:

session.query(Result).filter(Result.related_images.any(url='result2_1512149119.jpg'))

将返回以下数据:

result2_1512149091.jpg
result2_1512149094.jpg
result2_1512149097.jpg
result2_1512149100.jpg
result2_1512149103.jpg
result2_1512149105.jpg
result2_1512149109.jpg
result2_1512149111.jpg
result2_1512149113.jpg
result2_1512149117.jpg
result2_1512149119.jpg
result2_1512149122.jpg
result2_1512149125.jpg
result2_1512149128.jpg

我已经阅读了与any()函数有关的文档,但是仍然不清楚如何利用它来进行更细微的方法(或者甚至可能)。例如,对于我进行的查询类型,我只会事先了解文件名的result1子字符串。

我不明白为什么通过result1_1512149091.jpg子字符串过滤的查询也会返回result1_1512149094.jpg。对于我的特殊用途,这是理想的选择,但我不明白为什么它以这种方式工作。例如,我希望通过.any('result1')进行过滤也会返回result1映像的完整列表,但它没有返回。

我最终想做的是使用Regex表达式通过关联对象的属性值过滤,以便我可以进行.any(url={{REGEX EXPRESSION}})。这是可能的吗?

我最终想做的是使用Regex表达式通过关联对象的属性值过滤,以便我可以进行.any(url={{REGEX EXPRESSION}})。这是可能的吗?

当然是。您可以将任何SQL表达式传递给any()作为标准。例如,使用startswith()contains()like()本身或您有什么样的类似表达式:

session.query(Result).
    filter(Result.related_images.any(
        Image.url.startswith('result1')))

使用RegeXP通常是特定于DB的,并且您在问题中省略了一些信息,因此我尝试在此答案中避免使用。但是您将以与此处的类似表达相同的方式使用它。

相关内容

  • 没有找到相关文章

最新更新