2016-09-13 10 views
3

は私がmysqlの(5.7.12)で、次の表を持っている含まれているプリフォームする方法:SQLAlchemyののJSONコラム - クエリ

class Story(db.Model): 
    sections_ids = Column(JSON, nullable=False, default=[]) 

sections_idsを、basicly整数[1、2のリストです... 、n]。

stories = session.query(Story).filter(
     X in Story.sections_ids 
    ).all() 

それはスロー:

NotImplementedError: Operator 'contains' is not supported on this expression 

答えて

3

使用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() 

あなたがしているとして、私はsections_idsはX. が含まれています、私は次のことを試してみましたすべての行を取得する必要があります 最上位の配列を検索する場合、のパスを与える必要はありません。ここに来る誰のために

+0

あなたは[こちら] SQLAにおける一般的な機能について読むことができます(http://ドキュメント.sqlalchemy.org/en/latest/core/functions.html)。 –

+0

正しい構文が正しいですか?それは私のために働いていない...エラーは発生しません...それは次の行に続かない... – Shoham

+0

(私の場合、Xはintであり、それを文字列にキャストするときだけです働いた)。ありがとう! – Shoham

2

、代わりのPostgreSQLを使用している: あなたのフィールドはタイプsqlalchemy.dialects.postgresql.JSONB(とないsqlalchemy_utils.JSONType)のものでなければならない -

次にあなたがフィールドに関連付けられているComparatorオブジェクトを使用することができますそのcontains(および他の)演算子。

例:

Query(Mymodel).filter(MyModel.managers.comparator.contains(["[email protected]"])) 

(含まれている部分は、JSONフラグメントだけでなく、文字列でなければならないことに注意してください)

関連する問題