英文:
How to query over an attribute that consists of a string of JSON in SQLAlchemy?
问题
如你所见,metadata字段是字符串类型,包含明显是字符串的JSON数据。
现在,我想根据metadata的键来过滤结果,例如,我想返回那些metadata中participating设置为True的值。
类似于这样:
1, "London", "{'lat':51.5072, 'lon':0.1276, 'Mayor': 'Sadiq Khan', 'participating':True}",
3, "Manchester", "{'lat':53.4808, 'lon':2.2426, 'Mayor': 'Donna Ludford', 'participating':True}"
我尝试了以下方法:
db.session.query(City).filter(cast(eval(metadata['participating']), String) == True)
我收到了这个错误:
NotImplementedError: 运算符'getitem'不支持此表达式
我该如何实现所需的结果?
英文:
So, I table that looks like this.
City
id(Integer),
name(String),
metadata(String)
and it consists of data like this
1, "London", "{'lat':51.5072, 'lon':0.1276, 'Mayor': 'Sadiq Khan', 'participating':True}",
2, "Liverpool", "{'lat':53.4084, 'lon':2.9916, 'Mayor': 'Joanne Anderson', 'participating':"False},
3, "Manchester", "{'lat'53.4808, 'lon':2.2426, 'Mayor': 'Donna Ludford, 'participating':True}"
Now as you can see that the metadata field is of type string and consists of a JSON that is obviously a string.
Now, I want to filter the results based on the keys of metadata for example I want to return those values that have participating set to True in the metadata.
Something like this
1, "London", "{'lat':51.5072, 'lon':0.1276, 'Mayor': 'Sadiq Khan', 'participating':True}",
3, "Manchester", "{'lat'53.4808, 'lon':2.2426, 'Mayor': 'Donna Ludford, 'participating':True}"
I tried doing this
db.session.query(City).filter(cast(eval(metadata['participating]), String) == True)
I get this error
NotImplementedError: Operator 'getitem' is not supported on this expression
How do I achieve the desired result
答案1
得分: 0
你可以使用 Json 库:
第一部分:
import json
# 获取所有数据
city_list = db.session.query(City).all()
创建筛选列表
filtered_city_list = []
第二部分:
for city in city_list:
metadata_dict = json.loads(city.metadata)
if 'participating' in metadata_dict and metadata_dict['participating'] == True:
filtered_city_list.append(city)
你可以将它们全部实现在一个函数中并使用它。
英文:
you can use Json lib:
First:
import json
# Get all Data
city_list = db.session.query(City).all()
Make filter list
filtered_city_list = []
Second:
for city in city_list:
metadata_dict = json.loads(city.metadata)
if 'participating' in metadata_dict and metadata_dict['participating'] == True:
filtered_city_list.append(city)
you can implement all of them in function and use it
答案2
得分: 0
Step:1 ==> 定义City表的模型类。
Step:2 ==> 定义用于根据元数据列中的'participating'值筛选城市的查询。
Step:3 ==> 获取参与的城市列表。
import json
from sqlalchemy import func
class City(Base):
__tablename__ = 'City'
id = Column(Integer, primary_key=True)
name = Column(String)
metadata = Column(String)
participating_cities_query = db.session.query(City).filter(
func.json_extract(City.metadata, '$.participating').cast(Boolean) == True
)
participating_cities = participating_cities_query.all()
for city in participating_cities:
print(city.id, city.name, city.metadata)
英文:
Step:1 ==> Define the model class for the City table.
Step:2 ==> Define the query to filter the cities based on the 'participating' value in the metadata column.
Step:3 ==>Get the list of cities that are participating.
import json
from sqlalchemy import func
class City(Base):
__tablename__ = 'City'
id = Column(Integer, primary_key=True)
name = Column(String)
metadata = Column(String)
participating_cities_query = db.session.query(City).filter(
func.json_extract(City.metadata, '$.participating').cast(Boolean) == True
)
participating_cities = participating_cities_query.all()
for city in participating_cities:
print(city.id, city.name, city.metadata)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论