【问题标题】:Filter postgres STRING ARRAY Column with Flask-SQLAlchemy使用 Flask-SQLAlchemy 过滤 postgres STRING ARRAY 列
【发布时间】:2021-12-27 00:51:34
【问题描述】:

我需要在 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)
    .
    .
    .

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

【问题讨论】:

  • 我认为在这种情况下您可以使用overlap,请在此处查看示例:stackoverflow.com/questions/32747623/…
  • 如果我在该标签列的每个项目中都有一个单词,有时我喜欢“欧洲足球”,我只想按“足球”过滤,不区分大小写,需要它来查找较大字符串中的单词为:ilike ('%football%')
  • 现在我明白了,在这种情况下,也许您可​​以在模型中使用 column_property 并从模型中的数组 tags 创建一个假列,以从数组中创建字符串,然后与 @ 进行比较987654330@,我会尝试创建场景,但我需要准备我的环境。在这里查看我在说什么docs.sqlalchemy.org/en/14/orm/mapped_sql_expr.html

标签: python-3.x postgresql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

要生成您所说的查询,您可以使用 SQLAlchemy 函数中的函数 array_to_string_any,例如:

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

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

参见any_ 文档sqlalchemy any_ column modifier

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2022-01-15
    • 2015-06-01
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多