insertar un campo json en una tabla postgres

PHOTO EMBED

Tue Dec 09 2025 19:13:26 GMT+0000 (Coordinated Universal Time)

Saved by @jrg_300i #yii2

Recomendación: Usa la Opción 1 si es un solo registro, ya que es más simple y directa.

esto no lo puedo hacer de una manera mas simplificada:INSERT INTO public.entes
SELECT
    (data->>'id_ente')::integer,
    data->>'nombre_ente',
    data->>'descripcion',
    (data->>'id_sector')::integer,
    (data->>'id_estatus')::integer,
    data->>'rif',
    data->>'direccion',
    data->>'telf_ente',
    (data->>'id_asociacionente')::integer
FROM json_array_elements('[
    {
        "id_ente": 25,
        "nombre_ente": "FUVIDIT",
        "descripcion": "Fundación Venezolana de Investigación, Desarrollo e Innovación para el Transporte",
        "id_sector": 1,
        "id_estatus": 2,
        "rif": "RIF. G-20016149-3",
        "direccion": "Av. Francisco de Miranda con Av. hacia autopista Francisco Fajardo frente al Museo del Transporte, antiguo Complejo Vivero Odebrecht, Código Postal 1071, Edo. Miranda",
        "telf_ente": "(0212) 238.33.47",
        "id_asociacionente": 5
    }
]') AS data;
¡Sí, puedes simplificarlo! PostgreSQL tiene formas más directas para trabajar con JSON. Aquí te muestro algunas opciones más simplificadas:

Opción más simple (PostgreSQL 9.4+):
sql
INSERT INTO public.entes
SELECT * FROM json_populate_record(
    NULL::public.entes,
    '{
        "id_ente": 25,
        "nombre_ente": "FUVIDIT",
        "descripcion": "Fundación Venezolana de Investigación, Desarrollo e Innovación para el Transporte",
        "id_sector": 1,
        "id_estatus": 2,
        "rif": "RIF. G-20016149-3",
        "direccion": "Av. Francisco de Miranda con Av. hacia autopista Francisco Fajardo frente al Museo del Transporte, antiguo Complejo Vivero Odebrecht, Código Postal 1071, Edo. Miranda",
        "telf_ente": "(0212) 238.33.47",
        "id_asociacionente": 5
    }'
);
Otra forma aún más directa (PostgreSQL 9.5+):
sql
INSERT INTO public.entes
SELECT *
FROM jsonb_to_record('{
    "id_ente": 25,
    "nombre_ente": "FUVIDIT",
    "descripcion": "Fundación Venezolana de Investigación, Desarrollo e Innovación para el Transporte",
    "id_sector": 1,
    "id_estatus": 2,
    "rif": "RIF. G-20016149-3",
    "direccion": "Av. Francisco de Miranda con Av. hacia autopista Francisco Fajardo frente al Museo del Transporte, antiguo Complejo Vivero Odebrecht, Código Postal 1071, Edo. Miranda",
    "telf_ente": "(0212) 238.33.47",
    "id_asociacionente": 5
}') AS x(
    id_ente integer,
    nombre_ente varchar,
    descripcion varchar,
    id_sector integer,
    id_estatus integer,
    rif varchar,
    direccion varchar,
    telf_ente varchar,
    id_asociacionente integer
);
La más simple de todas (si tienes el JSON como variable):
Si estás usando un lenguaje de programación, la forma más simple sería:

sql
-- Si estás en psql o tienes el JSON como texto
\set contenido_json '{"id_ente":25,"nombre_ente":"FUVIDIT","descripcion":"Fundación Venezolana de Investigación, Desarrollo e Innovación para el Transporte","id_sector":1,"id_estatus":2,"rif":"RIF. G-20016149-3","direccion":"Av. Francisco de Miranda con Av. hacia autopista Francisco Fajardo frente al Museo del Transporte, antiguo Complejo Vivero Odebrecht, Código Postal 1071, Edo. Miranda","telf_ente":"(0212) 238.33.47","id_asociacionente":5}'

INSERT INTO public.entes SELECT * FROM json_populate_record(NULL::public.entes, :'contenido_json');
Mi recomendación:
Usa json_populate_record (primera opción) porque:

Es más corto y legible

No necesitas especificar los tipos de datos manualmente

Se adapta automáticamente a la estructura de la tabla

Es nativo de PostgreSQL

sql
-- Esta es la más simple y elegante:
INSERT INTO public.entes
SELECT * FROM json_populate_record(
    NULL::public.entes,
    '{"id_ente":25,"nombre_ente":"FUVIDIT","descripcion":"Fundación Venezolana de Investigación, Desarrollo e Innovación para el Transporte","id_sector":1,"id_estatus":2,"rif":"RIF. G-20016149-3","direccion":"Av. Francisco de Miranda con Av. hacia autopista Francisco Fajardo frente al Museo del Transporte, antiguo Complejo Vivero Odebrecht, Código Postal 1071, Edo. Miranda","telf_ente":"(0212) 238.33.47","id_asociacionente":5}'
);
Nota: Si tu JSON tiene un array (como en tu ejemplo original con []), usa json_populate_recordset en lugar de json_populate_record.

content_copyCOPY