【发布时间】: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