python-3.x - 使用 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)
.
.
.
我已经检查了文档和其他类似的问题,但没有找到任何适合我需要的解决方案。
解决方案
要进行您正在谈论的查询,您可以使用函数array_to_string
和_any
SQLAlchemy 函数,例如:
from sqlalchemy import func
articles = Article.query.filter(
func.array_to_string(Article.tags, ','). \
ilike(func.any_(['%fighting%', '%golf%']))
).all()
在any_
函数内部,您可以传递数组进行搜索。
请参阅any_
文档sqlalchemy any_ 列修饰符。
推荐阅读
- error-handling - 哪种错误处理模式更好:一个 try/catch 围绕大代码块,许多 try/catch 围绕较小的代码块?
- jquery - $(this).val() 方法没有返回所选 id 的正确值
- wordpress - 阻止允许域的内容安全策略标头
- c++ - std::distance 很慢,如何改进?
- node.js - GraphQL 突变返回 null
- python - 将 dict 转换为具有不同命名空间的 xml
- ruby-on-rails - 如何修复 Yarn 包在终端中已过期
- javascript - 如何制作一个永远循环并在 Node JS 中执行操作的非阻塞 Promise
- css - 如何使父元素与子元素一起缩放?(CSS 变换)
- dotnetnuke - 如何在不解压缩的情况下将 zip 文件上传到文件管理器(需要将其保留为 zip 文件)