Sqlalchemy json专栏 - 如何预先形成包含查询

时间:2016-09-13 12:33:34

标签: python mysql json sqlalchemy

我在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

2 个答案:

答案 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片段,而不仅仅是字符串)