Unyablog.

のにれんのブログ

SQLAlchemy で MySQL の JSON_CONTAINS をやる

SQLAlchemy で MySQLJSON_CONTAINS をやるには func.json_contains を用いれば良いのだけど、 JSON_CONTAINS のドキュメント にあるように candidateJSON ドキュメントである必要がある。

以下のようにすると hogeJSON ドキュメントではないためエラーが出る。

from sqlalchemy import func

# Foo.values は JSON の配列である想定

session.query(Foo).filter(
    func.json_contains(Foo.values, 'hoge')
).all()
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (3141, 'Invalid JSON text in argument 1 to function json_contains: "Invalid value." at position 1.')

JSON ドキュメントにするには JSON_QUOTE を使うと良い。JSON_QUOTE すると foo"foo" になる。

SQLAlchemy でやるには func.json_quote を挟む。

from sqlalchemy import func

# Foo.values は JSON の配列である想定

session.query(Foo).filter(
    func.json_contains(Foo.values, func.json_quote('hoge'))
).all()