【问题标题】:Using SQLAlchemy, How to filter by association object attribute and Regex?使用 SQLAlchemy,如何按关联对象属性和正则表达式进行过滤?
【发布时间】:2017-12-01 18:09:21
【问题描述】:

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

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 图像的完整列表,但它什么也不返回。

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

【问题讨论】:

    标签: python sqlalchemy many-to-many model-associations


    【解决方案1】:

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

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

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

    使用正则表达式通常有点特定于数据库,并且您在问题中省略了那一点信息,所以我试图在这个答案中避免它。但是你可以像这里的 LIKE 表达式一样使用它。

    【讨论】:

    • 太棒了,谢谢!使用regex 只是我的一个想法,当然不是必需的。我认为您的方法正是我想要实现的目标。
    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 2018-06-23
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多