En el manejo de bases de datos, uno de los retos principales ha sido lidiar con una amplia variedad de estructuras de datos, siendo JSON uno de los formatos más flexibles y complejos. PostgreSQL nos ofrece una poderosa funcionalidad para trabajar con objetos JSON, haciendo el manejo de estos datos tan natural como con estructuras primitivas.
¿Qué son los objetos JSON y cómo los maneja PostgreSQL?
JSON, o JavaScript Object Notation, es una estructura de datos ligera y de fácil comprensión que almacena pares de clave-valor. Gracias a su estructura jerárquica, JSON permite anidar datos fácilmente. PostgreSQL permite almacenar estos objetos de dos maneras:
JSON: Almacena los datos como texto, lo cual es efectivo pero puede ralentizar ciertas operaciones debido a la deserialización necesaria.
JSONB: Almacena los datos en formato binario, optimizando la velocidad de acceso y permitiendo realizar operaciones más rápidamente.
¿Cómo crear y manipular tablas con campos JSON en PostgreSQL?
Vamos a ver cómo podemos crear una tabla que contenga un campo de tipo JSON y realizar algunas operaciones básicas. Para comenzar, crearemos una tabla denominada ordenes con dos campos: un id serial y el campo info que almacenará nuestros objetos JSON.
CREATETABLE ordenes ( id SERIALPRIMARYKEY, info JSON NOTNULL);
Este campo info permitirá almacenar cualquier estructura JSON, dando flexibilidad al tipo de datos que podemos manejar.
¿Cómo insertar datos JSON en una tabla?
A continuación, podemos insertar datos JSON en nuestra tabla utilizando la sentencia INSERT. Es esencial envolver el objeto JSON en comillas para que PostgreSQL lo trate como una cadena:
Esto ilustra cómo varios registros pueden tener estructuras similares pero con información diversa, como distintos clientes y productos.
¿Cómo consultar y manipular datos JSON?
Consultar datos JSON es tan sencillo como utilizar la sentencia SELECT. Puedes recuperar sub-campos específicos de un objeto JSON utilizando el operador -> para claves JSON y con ->> si deseas el valor como texto.
Por ejemplo, para obtener el nombre del cliente:
SELECT info->>'cliente'AS cliente_nombre FROM ordenes;
Si deseas filtrar por un producto específico en el JSON, puedes usar el operador de filtro JSON igualmente:
SELECT info->>'cliente'AS cliente_nombre
FROM ordenes
WHERE info->'items'->0->>'producto'='biberón';
¿Por qué JSON es importante en PostgreSQL?
El soporte para JSON en PostgreSQL permite una flexibilidad extraordinaria para aplicaciones que requieren almacenar datos semiestructurados. Esto es especialmente útil en desarrollos ágiles donde los requisitos de datos pueden cambiar rápidamente. La capacidad de almacenar, consultar y filtrar eficientemente objetos JSON abre un amplio espectro de posibilidades para el desarrollo de aplicaciones modernas.
Con esta funcionalidad, PostgreSQL se coloca a la vanguardia en el manejo de datos NoSQL dentro de un sistema relacional, ofreciendo lo mejor de ambos mundos. Los invito a continuar explorando y aprovechando estas ventajas que PostgreSQL brinda para gestionar datos en formato JSON ¡Sigue aprendiendo y potenciando tus habilidades en la gestión de bases de datos!
Una caracteristica muy importante de PostgreSQL es su capacidad de trabajar con estructuras JSON.
JSON Texto plano - Es unicamente un string de texto.
JSON Binary - Es más rápido de procesar ya que se guarda como un archivo binario.
El uso de objetos nos dará más flexibilidad en el trabajo.
-- Inserción de datosINSERTINTO ordenes(info)VALUES('{"cliente":"Edna Moda", "items":{"producto":"Biberon", "cantidad":3}}'),('{"cliente":"Juan Moda", "items":{"producto":"Carro", "cantidad":3}}');-- Extrae los datos con formato JSONSELECT info->'cliente'AS cliente FROM ordenes;-- Extrae los datos con el tipo de dato asignado por PostgresSELECT info->>'cliente'AS cliente FROM ordenes;
Excelente resumen!
Que bueno tocar el tema del json porque es algo muy importante y cada vez se usa mucho más justamente para optimizar más el desempeño, en mi trabajo no usamos base de datos no sql y cuando tenemos formularios con mucha información entonces asignamos campos json o jsonb. No obstante solemos utilizar también esta función del postgres para convertir la fila o las filas en formato json
SELECT
json_build_object(
'id', id,
'info', info
)json_data
FROM ordenes
WHERE info -> 'items' ->> 'cantidad' = '1';
Esto lo que hace es devolver la consulta en formato json completo y eso a su vez al llamar en un formulario que utilice angular o react se puede devolver en formato json sin tener que convertir del lado del javascript(ejemplo)
Es sencillo, pero no lo he visto en los aportes...
Para sacar la tabla ORDENES completa a nivel texto sería así:
SELECT info ->>'cliente'AS cliente, info ->'items'->>'producto'AS producto, info ->'items'->>'cantidad'AS cantidad
FROM ordenes;
Trabajando con objetos
PostgreSQL permite trabajar directamente con objetos tipo JSON esto es una funcionalidad que no brindan todos los manejadores de datos
porque trabajar con objetos JSON es complicado
ya que son una cadena de texto con una estructura especifica, y lo que suele ocurrir es que los manejadores de datos guardan un string que evalúan en cada consulta que se les haga
PostgresSQL posee el tipo de dato json y jsonb que guarda los datos de forma binaria, estos tipos de datos permiten que internamente postgresql guarde una estructura con la que puede trabajar más cómodamente los tipos de datos json
Tabla con una columna en formato json
-- DROP TABLE ordenes;CREATETABLE ordenes( id serialNOTNULLPRIMARYKEY, info json NOTNULL);INSERTINTO ordenes (info)VALUES('{"cliente": "David Shanchez", "items": { "producto": "Biberon", "cantidad": "24" }}'),('{"cliente": "Jorge Luis", "items": { "producto": "Carro hotweels", "cantidad": "2" }}'),('{"cliente": "Sancho Panza", "items": { "producto": "Caja", "cantidad": "13" }}');-- regresa el valor aun en formato jsonSELECT info ->'cliente'AS cliente
FROM ordenes;-- regresa el valor en formato stringSELECT info ->>'cliente'AS cliente
FROM ordenes;-- usando filtros con un campo jsonSELECT info ->>'cliente'AS cliente
FROM ordenes
WHERE info ->'items'->>'producto'='Biberon';
Muy útil esta clase, nunca pensé que postgreSQL manejara JSON de manera tan amigable..
Así es!
CREATETABLEordenes(ID serial NOTNULLPRIMARYKEY, info json NOTNULL);SELECT*FROM ordenes;INSERTINTOordenes(info)VALUES('{"cliente": "David Sanchez", "items":{"producto":"Biberon", "cantidad":"24"}}'),('{"cliente": "Edna Cardenas Sanchez", "items":{"producto":"Carro Juguete", "cantidad":"4"}}'),('{"cliente": "Israel Vazquez", "items":{"producto":"Tren Juguete", "cantidad":"6"}}');SELECT*FROM ordenes;SELECT info ->'cliente'AS cliente
FROM ordenes;SELECT info ->>'cliente'AS cliente
FROM ordenes;SELECT info ->>'cliente'AS cliente
FROM ordenes
WHERE info ->'items'->>'producto'='Biberon';
Wow esta funcion es muy util, este manejador de bases de datos podria convertirse facilmente en la herramienta principal de una analysta de datos, solo le falta poder generar graficos jeje.
Como podría con un SELECT traer la columna cantidad dentro de items siendo este de formato JSON?
select info->items->>cantidad from ordenes;
Supongo que esta información te puede servir:
json_each(json)
select * from json_each('{"a":"foo", "b":"bar"}')
key
value
a
"foo"
b
"bar"
Funciones JSON PostgreSQL
según lo investigado JSON no es un lenguaje de programación sino un archivo que contiene datos estructurados, que se utiliza para transferir información entre sistemas.
Es el formato del archivo, en realidad, ya que viene del JavaScript Object Notation y lo que quiere decir es que la estructura de los datos contenidos en el archivo es igual a la de un objeto de JavaScript.
Wow! Me sorprende como Posgres permite manipular data de tipo JSON de forma tan sencilla y amigable. A diferencia, en Oracle resulta todo un lío.
Objetos JSON: Clave-Valor
Genial, muy bueno si se quiere generar un informe historico, ya tengo varios ejemplos en mente.
Para crear índices en columnas de tipo jsonb en PostgreSQL, puedes utilizar el índice GIN, que es eficiente para este tipo de datos. La sintaxis básica es:
CREATEINDEX idx_nombre ON nombre_tabla USING GIN (nombre_columna);
Esto permite realizar consultas más rápidas sobre los datos JSON. Por ejemplo:
CREATEINDEX idx_ordenes_info ON ordenes USING GIN (info);
Con esto, mejorarás el rendimiento en las consultas que involucren operaciones sobre el campo info que contiene datos en formato JSON.
De esta forma podemos hacer comparaciones numéricas, casteando el resultado:
SELECT info ->>'cliente'AS nombre_cliente
FROM ordenes
WHERE(info ->'items'->>'cantidad')::int >5;// clientes que compraron más de 5 productos
Entonces para poder manejar un json como un string en la query debemos utilizar doble flecha? ->>
Es correcto.
En la clase el profesor carga los datos en formato JSON manualmente, es posible importar un archivo JSON a una tabla?
¡Hola!
¿Cómo podría agregar valores desde un archivo JSON que ya tengo preparado?
Al crear la tabla ordenes me sale este error, cómo lo podría solucionar?
Por lo que veo ya hay una tabla con ese nombre. Podrias probar eliminar esa tabla y volver a ejecutar el query, o renombrar la tabla del query sería más seguro para la integridad de los datos.
¡Ay!, cómo no vi la tabla. Creí que refería a un error del modelo relacional o algo así, jejeje.
¡Muchas gracias Javi! :)
Como coloco multiples productos asociados a un cliente en ese formato JSON, y como los puedo consultar?
Lo muestra en el video, simplemente con varias llaves dentro del objeto JSON. La consulta tambien se muestra en el video y es con SELECT INFO -> "" as x