TypeError:类型为ResultProxy的对象不是JSON可序列化的:导致sqlalchemy查询?

时间:2018-09-21 19:17:37

标签: python sqlalchemy

我正在尝试在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序列化

2 个答案:

答案 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)