使用 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 表达式一样使用它。
使用 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 表达式一样使用它。