使用 Django 从 Postgres 导出 JSON 时结果不一致
Posted
技术标签:
【中文标题】使用 Django 从 Postgres 导出 JSON 时结果不一致【英文标题】:Inconsistent results when exporting JSON from Postgres using Django 【发布时间】:2014-08-09 09:45:37 【问题描述】:我正在尝试创建一个从 Postgres 返回 JSON 数据的 Django 视图(即来自 Postgres 的数据已经是 JSON 类型)。
我在开发环境中使用 Django 开发服务器和 Postgres,在生产环境中使用 Apache 和 Postgres(不同的服务器)。
此视图在我的开发环境中运行良好:
def my_custom_sql(request):
cursor = connection.cursor()
cursor.execute("... the query ...")
return HttpResponse(cursor.fetchone(), mimetype="application/json")
但是在我的生产环境中输出是不同的。
为了使它在生产中工作,我将第四行从:
return HttpResponse(cursor.fetchone(), mimetype="application/json")
到:
return HttpResponse(json.dumps(cursor.fetchone()[0]), mimetype="application/json")
这些是结果(我添加了换行符):
开发环境:
使用cursor.fetchone()
- 正确
["date":"2014-06-12","count":3,"sum":3,
"date":"2014-06-13","count":null,"sum":3,
"date":"2014-06-14","count":null,"sum":3,
"date":"2014-06-15","count":null,"sum":3,
"date":"2014-06-16","count":null,"sum":3,
"date":"2014-06-17","count":null,"sum":3]
使用 json.dumps(cursor.fetchone()[0])
- 不正确:不是真正的 JSON。
"[\"date\":\"2014-06-12\",\"count\":3,\"sum\":3, \n
\"date\":\"2014-06-13\",\"count\":null,\"sum\":3, \n
\"date\":\"2014-06-14\",\"count\":null,\"sum\":3, \n
\"date\":\"2014-06-15\",\"count\":null,\"sum\":3, \n
\"date\":\"2014-06-16\",\"count\":null,\"sum\":3, \n
\"date\":\"2014-06-17\",\"count\":null,\"sum\":3]"
生产环境:(数据不同,忽略)
使用cursor.fetchone()
- 不正确:注意python“u”字符串。
[u'date': u'2014-06-11', u'count': 4, u'sum': 4,
u'date': u'2014-06-12', u'count': 8, u'sum': 12,
u'date': u'2014-06-13', u'count': 7, u'sum': 19,
u'date': u'2014-06-14', u'count': 6, u'sum': 25,
u'date': u'2014-06-15', u'count': 1, u'sum': 26,
u'date': u'2014-06-16', u'count': 9, u'sum': 35,
u'date': u'2014-06-17', u'count': 4, u'sum': 39]
使用json.dumps(cursor.fetchone()[0])
- 正确
["date": "2014-06-11", "count": 4, "sum": 4,
"date": "2014-06-12", "count": 8, "sum": 12,
"date": "2014-06-13", "count": 7, "sum": 19,
"date": "2014-06-14", "count": 6, "sum": 25,
"date": "2014-06-15", "count": 1, "sum": 26,
"date": "2014-06-16", "count": 9, "sum": 35,
"date": "2014-06-17", "count": 4, "sum": 39]
如何在我的生产和开发环境中获得相同的结果?
【问题讨论】:
在您的开发环境中,cursor.fetchone()[0]
似乎正在返回 text
(str
),这就是它没有正确序列化为 JSON 的原因。在您的生产环境中,cursor.fetchone()[0]
正在返回 json
(dict
)。
【参考方案1】:
我也发生过类似的事情。我的 sql 正在返回 json。我的开发环境中的 Django 正在将 json 转换为包含列表列表的字典,但生产环境中的 django 正在返回包含字符串列表的字典。
我遇到的问题是 psycopg2 的不同版本。我在开发中运行 2.5,但在生产中运行 2.4。
检查所有包以确保您的开发环境与生产环境相同。
【讨论】:
以上是关于使用 Django 从 Postgres 导出 JSON 时结果不一致的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Boot 中使用 Copy 命令从 Postgres 导出数据
尝试使用 django 从 postgres DB 中按顺序获取下一个值
ODBC:从 Microsoft Access 导出到 Postgres 失败