【问题标题】:Postgres update returning value giving string instead of jsonPostgres更新返回值给出字符串而不是json
【发布时间】:2021-06-15 21:23:46
【问题描述】:

我正在尝试更新 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 更新整个专栏。我使用不同的表来跟踪已更改的历史/审计跟踪的更改。我使用 json 列是因为不同的团队使用不同的值,因为他们的需求可能不同,因此与其使用包含一百万列的表来处理不同的团队,json 似乎是管理它的最佳方式。

感谢您的帮助。

【问题讨论】:

    标签: python json postgresql sql-update psycopg2


    【解决方案1】:

    好的,所以我找到了解决方案。事实证明,因为我只是返回 *,postgres 正在获取我正在插入并返回的已经转储的值,而不是直接从表行返回。我不得不相应地修改 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.*
    

    所以基本上在我的 RETURNING 中我必须指定它来自哪个表,因为我将我的表重命名为“t”它必须是 t.* 或者如果你想要特定的列 t.column_name。

    我假设它会自动返回来自表的数据,而不是 FROM 语句创建的伪表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-26
      • 2022-12-06
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2021-11-03
      • 2019-01-19
      相关资源
      最近更新 更多