Costruire un oggetto JSON in una stored procedure

0

Le mie scuse se questo non è il forum giusto per porre questa domanda. Se lo è, per favore fatemelo sapere e lo trasferirò allo stack exchange.

Dopo aver scoperto una sfortunata limitazione della nostra libreria di mappatura dei dati PostgreSQL, ci siamo resi conto che abbiamo bisogno di scrivere stored procedure che memorizzino jsonb. Il nostro schema ha due tabelle di base:

table profile {
  id: primary key,
  profile: jsonb
}

table event {
  id: primary key,
  message: jsonb
}

Stiamo salvando atomicamente profili ed eventi. Ogni volta che creiamo un profile , vogliamo un event creato che contenga alcune informazioni sul profilo appena creato. Nello specifico, vogliamo salvare l'ID del profilo e i campi presenti sul profilo (essenzialmente il keyset dell'oggetto profile json).

Dal momento che il salvataggio dei record su entrambe queste tabelle deve essere atomico, dobbiamo fare qualche stravagante (leggi: fastidioso) operazioni json per creare message prima di salvarlo.

Prima di incollare il mio codice, vogliamo che la forma della nostra message assomigli a questa:

message: {
  'profileId': <id>,
  'fields': ['name', 'address', 'city'] // etc
  // ...a few more fields
}

In questo momento il nostro codice assomiglia a questo:

CREATE OR REPLACE FUNCTION insertEvent(profile JSONB)
    RETURNS NUMERIC AS $$
DECLARE
    profileId NUMERIC;
    eventMessage JSONB;
    fieldArray text;
BEGIN
    INSERT INTO profiles (profile) VALUES (profile) RETURNING id INTO profileId;
    eventMessage := json_build_object('profileId', profileId);
    eventMessage := eventMessage || jsonb_build_object('action', 'CREATE');
    fieldArray := jsonb_build_array(ARRAY(SELECT jsonb_object_keys(profile)));
    eventMessage := eventMessage || jsonb_build_object('fields', fieldArray);
    INSERT INTO event (message) VALUES (eventMessage);
    return 1; -- this will be changed, don't worry
END $$

Funziona, ma sono molto scontento di questo. Esiste un modo più conciso per separare le chiavi del parametro profile e inserirle nell'eventoMesage?

Grazie per il tuo aiuto!

    
posta davidicus 22.09.2017 - 19:40
fonte

0 risposte

Leggi altre domande sui tag