如何通过 unnest 结果 search/filter?
How to search/filter by unnest result?
我想在 ARRAY(TEXT)(使用 PostgreSQL)中 search/filter(不区分大小写)。虽然我发现直接不可能,但有人建议可以使用unnest的解决方案,所以我开始了。
我使用的table如下:
from sqlalchemy.dialects.postgresql import ARRAY
class CaseStudy(db.Model): # type: ignore
__tablename__ = "case_studies"
id = db.Column(db.Integer, primary_key=True)
...
solutions = db.Column(ARRAY(db.Text))
...
我可以用纯 SQL 做类似的事情(减去小写部分):
SELECT * FROM case_studies WHERE 'a' IN (select(unnest(case_studies.solutions)));
但我无法将其转换为 SQLAlchemy。我想我得到的最接近的是
result = session.query(cls.id).filter('a' in func.unnest(cls.solutions))
(但我得到了NotImplementedError: Operator 'contains' is not supported on this expression
)
或
result = session.query(cls.id).filter("a" in select(func.unnest(cls.solutions)))
但后来我得到 TypeError: argument of type 'Select' is not iterable
.
关于如何在 SQLAlchemy 中执行此操作的任何建议?还有,如何把unnest的结果转成小写?
我可以通过以下方式解决这个问题:
result = session.query(cls.id).select_from(func.unnest(cls.solutions).alias("sols")).filter(column("sols").ilike(f"%a%"))
如果有人发布更好的解决方案,我会重新采纳答案。
我想在 ARRAY(TEXT)(使用 PostgreSQL)中 search/filter(不区分大小写)。虽然我发现直接不可能,但有人建议可以使用unnest的解决方案,所以我开始了。
我使用的table如下:
from sqlalchemy.dialects.postgresql import ARRAY
class CaseStudy(db.Model): # type: ignore
__tablename__ = "case_studies"
id = db.Column(db.Integer, primary_key=True)
...
solutions = db.Column(ARRAY(db.Text))
...
我可以用纯 SQL 做类似的事情(减去小写部分):
SELECT * FROM case_studies WHERE 'a' IN (select(unnest(case_studies.solutions)));
但我无法将其转换为 SQLAlchemy。我想我得到的最接近的是
result = session.query(cls.id).filter('a' in func.unnest(cls.solutions))
(但我得到了NotImplementedError: Operator 'contains' is not supported on this expression
)
或
result = session.query(cls.id).filter("a" in select(func.unnest(cls.solutions)))
但后来我得到 TypeError: argument of type 'Select' is not iterable
.
关于如何在 SQLAlchemy 中执行此操作的任何建议?还有,如何把unnest的结果转成小写?
我可以通过以下方式解决这个问题:
result = session.query(cls.id).select_from(func.unnest(cls.solutions).alias("sols")).filter(column("sols").ilike(f"%a%"))
如果有人发布更好的解决方案,我会重新采纳答案。