如何用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
相关产品推荐
相关产品推荐

