web-dev-qa-db-fra.com

Mettre à jour un élément json dans le type de données json

Je n'arrive pas à comprendre comment mettre à jour un élément dans un type de données PostgreSQL 9.3.

Mon exemple:

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;

La partie json dans les "profils"

{
    "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": "[email protected]",
        "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": "[email protected]",
        "emailVerified": "none",
        "Added": null,
        "phone": "none",
        "address": "none",
        "country": "none",
        "region": "none",
        "city": "none",
        "Zip": "none"
    }
}

J'utilise x-edit pour le frontend, et j'espérais que quelque chose comme ça fonctionnerait, mais cela ne fonctionne pas:

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

Je n'arrive pas à trouver d'informations sur la mise à jour d'un type de données json.

14

Comme il ne s'agit que d'une chaîne, vous pourrez peut-être effectuer une simple modification/suppression d'un nœud avec la fonction regex_replace.

Par exemple, voici comment j'ai récemment supprimé un certain nœud JSON dans une table (toutes les lignes):

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

Remarque, pour tous mes données JSON, je garde un noeud "version":"(n).(n)" (c'est-à-dire la version du schéma) dans l'objet. De cette façon, je peux mettre à jour des objets conformes à une version spécifique. Vos besoins ne sont peut-être pas si complexes, mais s'ils le sont, cela aide certainement.

7
MikeM

Je pense que vous devrez mettre à jour le champ complet sur Postgres 9.3, du moins c'est ce que la documentation me dit.

La mise à jour des éléments individuels dans un document JSON se fera en 9.4 si je ne me trompe pas.

3
frlan

Essaye ça

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