Postgres 更新返回值给字符串而不是 json
Postgres update returning value giving string instead of json
我正在尝试更新 postgres 中的 json 列(这是使用执行值的批量更新)。我通过 API 接收到一个 json 对象。我将整个对象插入一列,该列被分类为 json 列
CREATE TABLE my_table(
id SERIAL PRIMARY KEY,
event_data json NOT NULL default '{}'::JSON,
createdt timestamp NOT NULL DEFAULT now()
);
我的更新脚本如下所示:
UPDATE my_tableAS t
SET event_data = e.event_data::json
FROM (VALUES %s) AS e(id, event_data)
WHERE t.id= e.id
RETURNING *
我在手前对所有 json 做了 json.dumps
event_list.append([event['id'], json.dumps(event['data'])])
一旦我得到完整的行,我就这样处理数据:
return json.loads(json.dumps(update_data, default=date_converter))
当直接插入 json 值时,这一切都正常工作,我在插入之前转储值,然后在返回的行上执行 json.dumps/loads。一切正常。只是更新方法。
以下是更新时通过 api 返回数据的方式:
[
{
"id": 170152,
"event_data": "{\"commenttxt\": \"Test comment\", \"descrtxt\": \"HELLO WORLD\", \"eventcmpltflg\": false, \"eventcmpltontmflg\": false, \"active\": true}",
"createdt": "2021-03-18T08:34:07Z"
}
]
这就是我插入时收到它的方式:
[
{
"id": 170152,
"event_data": {
"commenttxt": "Test comment",
"descrtxt": "Test descr",
"eventcmpltflg": false,
"eventcmpltontmflg": false,
"active": true
},
"createdt": "2021-03-18T08:34:07Z"
}
]
如果我删除 event_list.append 部分中的 json.dumps,我会收到错误消息“无法调整字典类型”。
对于某些上下文,我不会替换 json 中的单个元素。我正在用一组新的 json 更新整个专栏。我使用不同的 table 来跟踪 historical/audit 变化轨迹的变化。我使用 json 列是因为不同的团队使用不同的值,因为他们的需求可能不同,所以而不是使用具有一百万列的 table 来处理不同的团队 json 似乎是管理它的最佳方式.
感谢任何帮助。
好的,所以我找到了解决方案。结果是因为我只是 returning * postgres 正在获取我正在插入的已经转储的值并且 returning 而不是 returning 来自 table 行直接地。我不得不相应地修改 SQL
UPDATE my_table AS t
SET event_data = e.event_data::json
FROM (VALUES %s) AS e(id, event_data)
WHERE t.id= e.id
RETURNING t.*
所以基本上在我的返回中我必须指定它来自哪个 table 并且因为我将我的 table 重命名为“t”它必须是 t.* 或者如果你想要特定的列t.column_name.
我假设它会自动 return 来自 table 的数据,而不是 FROM 语句创建的伪 table。
我正在尝试更新 postgres 中的 json 列(这是使用执行值的批量更新)。我通过 API 接收到一个 json 对象。我将整个对象插入一列,该列被分类为 json 列
CREATE TABLE my_table(
id SERIAL PRIMARY KEY,
event_data json NOT NULL default '{}'::JSON,
createdt timestamp NOT NULL DEFAULT now()
);
我的更新脚本如下所示:
UPDATE my_tableAS t
SET event_data = e.event_data::json
FROM (VALUES %s) AS e(id, event_data)
WHERE t.id= e.id
RETURNING *
我在手前对所有 json 做了 json.dumps
event_list.append([event['id'], json.dumps(event['data'])])
一旦我得到完整的行,我就这样处理数据:
return json.loads(json.dumps(update_data, default=date_converter))
当直接插入 json 值时,这一切都正常工作,我在插入之前转储值,然后在返回的行上执行 json.dumps/loads。一切正常。只是更新方法。
以下是更新时通过 api 返回数据的方式:
[
{
"id": 170152,
"event_data": "{\"commenttxt\": \"Test comment\", \"descrtxt\": \"HELLO WORLD\", \"eventcmpltflg\": false, \"eventcmpltontmflg\": false, \"active\": true}",
"createdt": "2021-03-18T08:34:07Z"
}
]
这就是我插入时收到它的方式:
[
{
"id": 170152,
"event_data": {
"commenttxt": "Test comment",
"descrtxt": "Test descr",
"eventcmpltflg": false,
"eventcmpltontmflg": false,
"active": true
},
"createdt": "2021-03-18T08:34:07Z"
}
]
如果我删除 event_list.append 部分中的 json.dumps,我会收到错误消息“无法调整字典类型”。
对于某些上下文,我不会替换 json 中的单个元素。我正在用一组新的 json 更新整个专栏。我使用不同的 table 来跟踪 historical/audit 变化轨迹的变化。我使用 json 列是因为不同的团队使用不同的值,因为他们的需求可能不同,所以而不是使用具有一百万列的 table 来处理不同的团队 json 似乎是管理它的最佳方式.
感谢任何帮助。
好的,所以我找到了解决方案。结果是因为我只是 returning * postgres 正在获取我正在插入的已经转储的值并且 returning 而不是 returning 来自 table 行直接地。我不得不相应地修改 SQL
UPDATE my_table AS t
SET event_data = e.event_data::json
FROM (VALUES %s) AS e(id, event_data)
WHERE t.id= e.id
RETURNING t.*
所以基本上在我的返回中我必须指定它来自哪个 table 并且因为我将我的 table 重命名为“t”它必须是 t.* 或者如果你想要特定的列t.column_name.
我假设它会自动 return 来自 table 的数据,而不是 FROM 语句创建的伪 table。