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。