Json veri tipinde bir json öğesini güncelleme


14

PostgreSQL 9.3 veri tipindeki bir öğeyi nasıl güncelleyebileceğimi anlayamıyorum.

Örneğim:

CREATE TABLE "user"
(
  id uuid NOT NULL,
  password character varying(255),
  profiles json,
  gender integer NOT NULL DEFAULT 0,
  created timestamp with time zone,
  connected timestamp with time zone,
  modified timestamp with time zone,
  active integer NOT NULL DEFAULT 1,
  settings json,
  seo character varying(255) NOT NULL,
  CONSTRAINT id_1 PRIMARY KEY (id)
)
WITH (
  OIDS=TRUE
);
ALTER TABLE "user"
  OWNER TO postgres;

"Profiller" deki json bölümü

{
    "Facebook": {
        "identifier": "xxxxxxxxxxx",
        "profileURL": "none",
        "webSiteURL": "none",
        "photoURL": "none",
        "displayName": "test2 test2",
        "description": "none",
        "firstName": "test2",
        "lastName": "test2",
        "gender": 2,
        "language": "none",
        "age": "none",
        "birthDay": "none",
        "birthMonth": "none",
        "birthYear": "none",
        "email": "test@test.com",
        "emailVerified": "none",
        "Added": null,
        "phone": "none",
        "address": "none",
        "country": "none",
        "region": "none",
        "city": "none",
        "zip": "none"
    },
    "Google": {
        "identifier": "xxxxxxxxxxxxxxxxxxxxxx",
        "profileURL": "none",
        "webSiteURL": "none",
        "photoURL": "none",
        "displayName": "test2 test2",
        "description": "none",
        "firstName": "test2",
        "lastName": "test2",
        "gender": 2,
        "language": "none",
        "age": "none",
        "birthDay": "none",
        "birthMonth": "none",
        "birthYear": "none",
        "email": "test@test.com",
        "emailVerified": "none",
        "Added": null,
        "phone": "none",
        "address": "none",
        "country": "none",
        "region": "none",
        "city": "none",
        "zip": "none"
    }
}

Ön uç için x-edit kullanıyorum ve böyle bir şeyin işe yarayacağını umuyordum, ancak çalışmıyor:

UPDATE public.user 
SET "profiles"->'Facebook'->'social'->'facebook' = 'test' WHERE` id='id'

Bir json veri tipini güncelleme hakkında herhangi bir bilgi bulamıyorum.

Yanıtlar:


7

Bu sadece bir dize olduğundan, bir düğümde regex_replacefonksiyonla basit bir değişiklik / silme işlemi gerçekleştirebilirsiniz .

Örneğin, bu nasıl son zamanlarda bir tabloda (tüm satırlar) belirli bir JSON düğümünü sildi:

UPDATE my_db.my_table
SET my_column = (regexp_replace(my_column::text, ',"some_json_node":(.*),', ','))::json
WHERE NOT my_column IS NULL

Not, tüm JSON verilerim için, "version":"(n).(n)"nesnede bir (yani şema sürümü) düğüm tutun . Bu şekilde belirli bir sürüme uyan nesneleri güncelleyebilirim. Gereksinimleriniz o kadar karmaşık olmayabilir, ama eğer öyleyse, kesinlikle yardımcı olur.


Col name height = {'unit': 'cms', 'value' gibi json nesnesi için buna ihtiyacım var: 150}
Rahul Dapke

3

Postgres 9.3'teki tüm alanı güncellemeniz gerektiğini düşünüyorum, en azından belgelerin bana söylediği şey bu.

Yanılmıyorsam bir JSON belgesindeki öğeleri tek tek güncellemek 9.4'te olacaktır.


2

Bunu dene

UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb 
WHERE id = 1;

Col name height = {'unit': 'cms', 'value' gibi json nesnesi için buna ihtiyacım var: 150}
Rahul Dapke
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.