【问题标题】:On conflict, update if json value is different in PostgreSQL?冲突时,如果 PostgreSQL 中的 json 值不同,则更新?
【发布时间】:2019-07-22 10:41:16
【问题描述】:

如果“raw_data”表中的“info”列与现有的不同,我想更新它。

info”是 JSON 数据类型。

例如,如果“info”数据存在,则什么都不做,否则更新。

代码和尝试:

如果我使用以下代码:

cursor = connection.cursor()

postgres_insert_query = 
"""
INSERT INTO raw_data (Timestamp, IMIE, info) VALUES (%s,%s,%s)
ON CONFLICT (Timestamp)
DO UPDATE SET
info = EXCLUDED.info 
WHERE raw_data.info IS DISTINCT FROM EXCLUDED.info;"""

record_to_insert = (int(timestamp), int(imei), json_file)
cursor.execute(postgres_insert_query, record_to_insert)
connection.commit()

错误:

然后我会收到以下错误:

psycopg2.errors.InFailedSqlTransaction:当前事务是 中止,在事务块结束之前忽略命令

示例/伪代码:

什么都不做案例:

If Current "info" = {someData: 'ON'} 
Existing "info" = {someData: 'ON'} 
Then Do Nothing

更新案例:

If Current "info" = {someData: 'OFFFFFFFFFFF'} 
Existing "info" = {someData: 'ON'} 

UPDATE the "info"

【问题讨论】:

  • @GordonLinoff,感谢您的回复,正如我所建议的那样,我已经添加了示例数据并需要。
  • @a_horse_with_no_name,你说得对,我已经添加了错误信息。
  • 错误“current transaction is aborted, commands ignored until end of transaction block”表示在您运行最后一条语句之前还有其他问题

标签: sql json postgresql psycopg2


【解决方案1】:

您不能将 JSON 值与 =<> (这是 is distinct from 在后台使用的)进行比较。如果您想比较 complete JSON 值,您必须将该列的数据类型更改为 jsonb,例如以下工作正常。

使用此示例表:

create table raw_data ("timestamp" timestamp primary key, imie text, info jsonb);

然后你可以运行这个:

INSERT INTO raw_data ("timestamp", imie, info) 
VALUES (timestamp '2019-07-22 00:00:00', '1234', '{"x": 1, "someData": "on"}')
ON CONFLICT ("timestamp")
DO UPDATE 
  SET info = EXCLUDED.info 
WHERE raw_data.info IS DISTINCT FROM EXCLUDED.info;

在线示例:https://rextester.com/IOYXB82745

但看起来您实际上并不想比较完整的 JSON 值,而只想比较一个键。然后您可以执行以下操作,这也适用于json

INSERT INTO raw_data ("timestamp", imie, info) 
VALUES (timestamp '2019-07-22 00:00:00', '1234', '{"x": 1, "someData": "on"}')
ON CONFLICT ("timestamp")
DO UPDATE 
  SET info = EXCLUDED.info 
WHERE raw_data.info ->> 'someData' IS DISTINCT FROM EXCLUDED.info ->> 'someData';

在线示例:https://rextester.com/VML98935

【讨论】:

  • 哦,rextester。泰。
猜你喜欢
  • 2017-08-01
  • 2020-06-23
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2018-08-01
相关资源
最近更新 更多