首页 > 解决方案 > 使用 Flask-SQLAlchemy 过滤 postgres STRING ARRAY 列

问题描述

我需要在 Postgres 数据库上通过 STRINGS 列的 ARRAY 过滤查询结果。并且需要它不区分大小写,作为 ' ilike ' postgres 函数工作。这是我需要在 FLask-SQLAlchemy 语法中工作的查询:

select * from articles a 
where array_to_string(a.tags, ',') ilike any (array['%football%', '%basketball%'])

我已经尝试过这些语法:

Article.query.filter(Article.tags.contains(f"{{{tags}}}")).all()
Article.query.filter(Article.tags.ilike(f"%{tags}%")).all()
Article.query.filter(Article.tags.in_(tags).all()

其中 tags 是这样的字符串列表:

tags = [
            'football', 
            'basketball', 
            'hockey', 
            'soccer', 
            'baseball', 
            'golf', 
            'fighting', 
            'tennis'
        ]

SQLAlchemy 模型定义:

class Article(db.Model):
    __tablename__ = 'articles'

    article_id = db.Column(db.BigInteger, primary_key=True, autoincrement=False)
    headline = db.Column(db.String)
    source = db.Column(db.String)
    summary = db.Column(db.String)
    tags = db.Column(ARRAY(db.String), default=[])
    timestamp = db.Column(db.DateTime)
    url = db.Column(db.String)
    .
    .
    .

我已经检查了文档和其他类似的问题,但没有找到任何适合我需要的解决方案。

标签: python-3.xpostgresqlflasksqlalchemyflask-sqlalchemy

解决方案


要进行您正在谈论的查询,您可以使用函数array_to_string_anySQLAlchemy 函数,例如:

from sqlalchemy import func
articles = Article.query.filter(
    func.array_to_string(Article.tags, ','). \
        ilike(func.any_(['%fighting%', '%golf%']))
    ).all()

any_函数内部,您可以传递数组进行搜索。

请参阅any_文档sqlalchemy any_ 列修饰符


推荐阅读