如何在SQLAlchemy中正确检查JSON嵌套字典的指定键是否存在?
正确查询包含指定user_id键的JSON字段数据
你当前通过将JSON转为字符串搜索user_id的方式确实不可靠,会出现误匹配值而非键的情况。以下是满足三个查询条件的正确实现方式:
核心思路
直接针对JSON结构的键存在性做检查,而非字符串匹配:
- 确保
settings不为空 - 确认
settings中存在user_parameters键 - 确认
user_parameters字典中存在目标user_id键
修正后的代码
user_id = '100952' select([self.db.segments]).where( and_( # 条件1:settings不为空 self.db.segments.c.settings.isnot(None), # 条件2:settings中存在user_parameters键 cast(self.db.segments.c.settings, JSON)["user_parameters"].isnot(None), # 条件3:user_parameters中存在指定user_id键 cast(self.db.segments.c.settings, JSON)["user_parameters"].has_key(user_id) ) )
补充说明
- 如果你的数据库使用PostgreSQL的
jsonb类型(推荐用于JSON字段),可以将JSON替换为JSONB,能获得更好的性能和更多JSON操作支持:from sqlalchemy.dialects.postgresql import JSONB select([self.db.segments]).where( and_( self.db.segments.c.settings.isnot(None), cast(self.db.segments.c.settings, JSONB).has_key('user_parameters'), cast(self.db.segments.c.settings, JSONB)['user_parameters'].has_key(user_id) ) ) has_key方法是SQLAlchemy对数据库JSON键检查函数的封装,底层会自动适配不同数据库的语法(比如PostgreSQL的?操作符、MySQL的JSON_CONTAINS_PATH),彻底避免了字符串匹配的误判问题。
内容的提问来源于stack exchange,提问作者user16965639
相关产品推荐
相关产品推荐

