使用 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 从 MySQL 迁移到 Postgres

尝试使用 django 从 postgres DB 中按顺序获取下一个值

ODBC:从 Microsoft Access 导出到 Postgres 失败

在 postgres 上将表导出为 CSV,而无需使用“文本到列”

DBeaver,从数据库 Postgres,表结构(属性)导出到文件 .txt