LIKE SQL-使用 Peewee 查询数组

LIKE SQL-query on an array using Peewee

我有一个 PostgreSQL table,它有一个包含标签数组的列(标签列中的数组数据类型)。使用 Peewee(python ORM),我想 select 任何标签与列表中任何字符串的 part/substring 匹配的所有行。

所以,例如,我可以有一个如下所示的列表:

["stan", "tina"]

并且应该匹配 table 中具有任何标签 afghanistanpakistanstanfordargentina 的所有行。

SQL 查询可能如下所示:

SELECT * FROM media WHERE tags::text LIKE ANY (ARRAY[‘%stan%‘, ‘%tina%‘]);

我如何使用 Peewee 执行此操作?

tags 列的模型如下:

tags = ArrayField(TextField)

假设您的模型看起来像

from peewee import Model, TextField
from playhouse.postgres_ext import ArrayField


class Media(Model):
    tags = ArrayField(TextField)

使用数组字段创建子查询 unnested

from peewee import fn

subquery = (Media.select(Media.id.alias('id'),
                         fn.unnest(Media.tags).alias('unnested_tags'))
            .alias('subquery'))

正在生成标签过滤器

tags = ["stan", "tina"]
tags_filters = [subquery.c.unnested_tags.contains(tag) for tag in tags]
tags_filter = reduce(operator.or_, tags_filters)

最终查询将是

query = (Media.select().join(subquery,
                             on=subquery.c.id == Media.id)
         .filter(tags_filter)
         # gets rid of duplicates
         .group_by(Media.id))

P。 S.: 在 Python 3 reduce 函数可用在 functools module while in Python 2 it is a built-in