我在mysql(5.7.12)中有以下表格:
class Story(db.Model):
sections_ids = Column(JSON, nullable=False, default=[])
sections_ids 基本上是整数列表[1,2,...,n]。 我需要获取sections_ids包含X的所有行。 我尝试了以下方法:
stories = session.query(Story).filter(
X in Story.sections_ids
).all()
但它会抛出:
NotImplementedError: Operator 'contains' is not supported on this expression
答案 0 :(得分:5)
使用JSON_CONTAINS(json_doc, val[, path])
:
from sqlalchemy import func
# JSON_CONTAINS returns 0 or 1, not found or found. Not sure if MySQL
# likes integer values in WHERE, added == 1 just to be safe
session.query(Story).filter(func.json_contains(Story.section_ids, X) == 1).all()
当您在顶层搜索数组时,您无需提供路径。
答案 1 :(得分:4)
对于谁来到这里,但使用的是PostgreSQL:
您的字段应为df_result
类型(而不是sqlalchemy_utils.JSONType) -
然后,您可以使用与该字段关联的Comparator
对象及其sqlalchemy.dialects.postgresql.JSONB
(和其他)运算符。
示例:
contains
(请注意,包含的部分必须是JSON片段,而不仅仅是字符串)