首页 > 解决方案 > 如何在ORM查询中使用路径编写mysql json_contains函数的第一个参数

问题描述

我在sqlalchemy原始 sql 中写一个查询是

select * from my_table where JSON_CONTAINS( info->'$.user[*].id', '["bob", "tom"]','$');

现在不知道怎么写成ORM格式

我试过这个

session.query(my_table).filter(func.json_contains(my_table.info["user"]["*"]["id"],'["bob", "tom"]','$'))

但没有工作

标签: pythonmysqlsqlalchemy

解决方案


您还需要在->此处翻译运算符。从关于 JSON 搜索功能的 MySQL 参考文档

运算符在与两个参数一起使用时充当函数的->别名,JSON_EXTRACT()左侧是列标识符,右侧是根据 JSON 文档(列值)评估的 JSON 路径。

SQLAlchemy 1.3 及更高JSON_EXTRACT()版本通过使用item subscription原生支持,所以columnname[expression]. 您需要在此处将右侧的整个表达式作为单个字符串传递:

session.query(my_table).filter(
    func.json_contains(
        my_table.info["$user.*.id"], 
        '["bob", "tom"]',
        '$'
    )
)

然后将my_table.info["$user.*.id"]Python 表达式编译为JSON_EXTRACT(info, "$user.*.id"),相当于info->"$user.*.id".


推荐阅读