在SQLAlchemy中如何筛选jsonb列值为非空字典的行?
过滤非空JSON字典的规范实现方案
下面分两种场景给出对应方案:
场景1:availability为数据库原生JSON/JSONB类型(推荐方案)
这是最规范的实现方式,完全规避字符串匹配的各类兼容问题,性能更优,也支持后续JSON相关查询扩展:
- PostgreSQL(JSONB类型):使用
jsonb_length函数判断字典键的数量,ORM写法为:
from sqlalchemy import func filter(func.jsonb_length(ListEntry.availability) > 0)
对应原生SQL:WHERE jsonb_length(availability) > 0
- MySQL 8.0+:使用
JSON_LENGTH函数,ORM写法为:
from sqlalchemy import func filter(func.json_length(ListEntry.availability) > 0)
对应原生SQL:WHERE JSON_LENGTH(availability) > 0
场景2:availability为字符串类型存储序列化JSON
如果你的字段是用VARCHAR/TEXT存的JSON序列化结果,可以优化原有的字符串匹配逻辑,避免空白字符导致的匹配失效:
- 先去除字段值前后的空白字符再匹配空字典,ORM写法为:
from sqlalchemy import func filter(func.trim(ListEntry.availability) != '{}')
对应原生SQL:WHERE TRIM(availability) != '{}'
注:你原写法里的
'"{}"'多了一层引号,大概率是JSON序列化时额外加了转义导致的,建议先确认字段存储的实际格式,避免匹配逻辑和实际存储格式不匹配。
内容的提问来源于stack exchange,提问作者Olly Middleton
相关产品推荐
相关产品推荐

