我正在尝试在sqlalchemy中的表中查询3个字段:
if request.method == 'GET':
search_form = SearchForm()
result = dbSession.execute(
"SELECT * FROM books WHERE (isbn LIKE '%:text%') OR (title LIKE '%:text%') OR (author LIKE '%:text%') LIMIT 10",
{ "text": search_form.searchText.data }
)
return jsonify({'result': result})
我的查询正确吗?为什么会有这个错误?
TypeError:ResultProxy类型的对象不可JSON序列化
答案 0 :(得分:2)
简单地错误指出result
不是字典。要解决它:
jsonify({'result': [dict(row) for row in result]})
它将把每一行转换成字典。
答案 1 :(得分:0)
我遇到了这个错误,起初有点令人困惑,所以可能值得进一步解释。
SQLAlchemy SQL查询的结果是一个列表(您可以使用type(results)
进行检查),这很令人困惑,因为通常您可以将列表直接添加到字典中,然后jsonify
。此外,它看起来像一个元组列表,jsonify
通常也会再次接受它。
但这是关键:它实际上是SQLAlchemy的ResultsProxy类型的对象的列表-因此出错。
因此出现错误是因为它是不可jsonify类型的列表。但是,不必按照上面的metmirr的回答将其转换为字典,也可以选择将其转换为列表,然后稍后将该列表包括在字典中。两种方法都不对,但是如果您习惯于从psycopg2获取元组列表,则该方法可能会更好地匹配您通常的工作流程:
results = [list(row) for row in result]
result_dict = {'results': results}
return jsonify(results_dict)