You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQLAlchemy查询MySQL中含引号的mediumtext字段内容?

解决方案

方法一:利用MySQL的JSON函数(推荐)

虽然字段类型是mediumtext,但只要存储内容是合法JSON格式,MySQL支持直接对该字段调用JSON相关函数。SQLAlchemy可通过func调用这些原生函数:

方式1:用JSON_CONTAINS匹配完整键值对

from sqlalchemy import func

# 构造要匹配的JSON片段字符串
match_json = '{"a": "a1"}'
result = session.query(MyTable).filter(func.json_contains(MyTable.MyColumn, match_json)).all()

方式2:用JSON_VALUE精准匹配键对应的值

如果仅需匹配特定键的取值,JSON_VALUE会直接返回无引号的字段值,更直观:

from sqlalchemy import func

result = session.query(MyTable).filter(func.json_value(MyTable.MyColumn, '$.a') == 'a1').all()

方法二:正则表达式匹配(兼容旧版MySQL)

若你的MySQL版本低于5.7(不支持JSON函数),可通过正则表达式适配键值对的多种格式(处理空格、引号的变化):

result = session.query(MyTable).filter(MyTable.MyColumn.op('regexp')(r'"a"\s*:\s*"a1"')).all()

正则表达式"a"\s*:\s*"a1"会匹配:

  • "a": "a1"(带空格)
  • "a":"a1"(无空格)
  • "a" : "a1"(多空格)等多种格式

原写法失败原因

  • 你之前的contains/like仅匹配了固定格式的键值对(比如固定带空格),但实际存储的JSON可能存在空格数量不一致的情况
  • 转义写法因SQLAlchemy的字符串处理逻辑,导致最终传递给MySQL的语句不符合预期

内容的提问来源于stack exchange,提问作者Gil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:50:30