SQLAlchemy で MySQL の JSON_CONTAINS をやる
SQLAlchemy で MySQL の JSON_CONTAINS
をやるには func.json_contains
を用いれば良いのだけど、 JSON_CONTAINS のドキュメント にあるように candidate
は JSON ドキュメントである必要がある。
以下のようにすると hoge
は JSON ドキュメントではないためエラーが出る。
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()