我有一个PostgreSQL表,它有一个带有标签数组(标记列中的数组数据类型)的列。使用Peewee ( python ),我希望选择任何标记都匹配列表中任何字符串的部分/子字符串的所有行。
因此,例如,我可以有一个清单如下所示:
["stan", "tina"]
这应该匹配表中所有具有标记afghanistan
、pakistan
、stanford
或argentina
的行。
SQL查询可以如下所示:
SELECT * FROM media WHERE tags::text LIKE ANY (ARRAY[‘%stan%‘, ‘%tina%‘]);
我要怎么用Peewee做这件事?
tags
列的模型如下:
tags = ArrayField(TextField)
发布于 2017-05-11 00:41:40
假设你的模型看起来像
from peewee import Model, TextField
from playhouse.postgres_ext import ArrayField
class Media(Model):
tags = ArrayField(TextField)
使用数组字段非嵌套创建子查询
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))
https://stackoverflow.com/questions/43909799
复制