使用 SQLAlchemy,如何按关联对象属性和正则表达式进行过滤?

Using SQLAlchemy, How to filter by association object attribute and Regex?

使用 any() method 我可以像这样过滤查询:

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

这是过滤与 Result class 相关的图像,该图像与关联对象 ResultImages 定义的 Image 对象有关系,这样session.query(Result.related_images).all() 将 return 所有指定为与 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'))

会return以下数据:

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 子字符串过滤的查询也会 return result1_1512149094.jpg。对于我的特殊用途,这是理想的,但我不明白为什么它以这种方式工作。例如,我希望按 .any('result1') 过滤也会 return result1 图像的完整列表,但它 return 什么都没有。

我最终想做的是使用正则表达式按关联对象的属性值进行过滤,这样我就可以做到 .any(url={{REGEX EXPRESSION}})。有这种可能吗?

What I'd ultimately like to do is filter by an Association Object's attribute values using a regex expression, such that I could do .any(url={{REGEX EXPRESSION}}). Is this a possibility?

当然是。您可以将任何 SQL 表达式传递给 any() as criterion. For example a LIKE expression, using startswith(), contains(), like() 本身,或者您有什么:

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

使用正则表达式通常有点特定于数据库,并且您在问题中省略了那部分信息,因此我在这个答案中尽量避免使用它。但您可以像此处的 LIKE 表达式一样使用它。