AppMaster ofrece amplias capacidades para trabajar con la base de datos. Por ejemplo, usando el bloque de búsqueda, puede encontrar los datos necesarios, adjuntarles tablas relacionadas, ordenarlos en el orden correcto, etc. Sin embargo, en ciertas situaciones, esto puede no ser suficiente, y luego el bloque SQL Exec llega a el rescate. Le permite ejecutar cualquier consulta de base de datos utilizando todo el poder de SQL.
Consideremos el funcionamiento del bloque usando el ejemplo de una base de datos que contiene un catálogo de libros.
Hagamos un poco de trabajo de preparación. Es necesario crear un proceso de negocio que, en su forma más simple, permita enviar solicitudes, así como recibir sus resultados.
También deberá crear un punto final que le permitirá acceder a este proceso comercial.
En la etapa inicial, esto debería ser suficiente. Puede publicar su aplicación y pasar a la prueba. Para ello es muy conveniente utilizar Swagger, que se crea automáticamente al publicar.
Usamos una consulta simple que debería solicitar todos los libros de la base de datos.
SELECCIONAR * DE public.book
Tenga en cuenta que la tabla en sí (como todas las demás tablas creadas en el editor de la base de datos) tiene un prefijo que indica el esquema: público.
Puede verificar que la solicitud se completó exitosamente y se recibió el resultado.
Pero el problema es que es muy difícil percibir la respuesta de esta forma. Una posible solución es modificar un poco la solicitud y dejar solo los campos necesarios, por ejemplo, el título del libro y el número de páginas. Además, sería razonable establecer un límite, solicitar no todos los libros de la base de datos, sino limitarse a diez.
SELECCIONE nombre, páginas DE public.book LÍMITE 10
Mucho mejor, pero todavía no es adecuado para un uso real. Después de todo, en un proceso de negocio no sólo es necesario recibir una solicitud, sino también hacer algo con su resultado. Para ello no basta con tener el resultado en forma de texto; debe convertirlo en un modelo adecuado para su uso posterior.
Para hacer esto, volvamos al proceso de negocio y refinemos un poco. En el bloque final, agregaremos una nueva variable: una serie de modelos de libros.
También necesitará un bloque que convierta el JSON recibido como resultado de la solicitud en un modelo. Deserializar JSON al modelo.
Repitamos la solicitud anterior y asegurémonos de que el resultado sea mucho más adecuado, tanto para la percepción visual como para su uso posterior en BP.
Ahora podemos pasar a una lógica más compleja. Creemos un proceso de negocio que:
- Recibe el título del libro como entrada.
- Determina a qué categoría (género) pertenece.
- Devuelve como resultado 3 libros aleatorios de la misma categoría (en este caso, el libro de la solicitud no debe estar entre ellos)
Para ello, crearemos un nuevo proceso de negocio que combine la búsqueda mediante bloques estándar y el uso de consultas SQL.
El primer bloque consiste en buscar un libro por su título y también determinar a qué categorías pertenece. Para ello utilizamos el bloque de búsqueda con los siguientes parámetros:
- _With = Categorías: además del libro en sí, el resultado de la consulta requiere información de la tabla de categorías asociada.
- _Limit = 1: solo es necesario encontrar un libro.
- _Ilike = False: el nombre debe coincidir exactamente con el solicitado.
- Nombre: índice del título del libro, pasado desde el bloque Inicio.
Usando el bloque Array Element con índice 0, tomamos el primer (y único) libro del resultado.
Un libro puede pertenecer a varias categorías diferentes a la vez, y en este caso cualquiera de ellas nos convendrá. Se puede seleccionar aleatoriamente usando el bloque de elementos aleatorios.
Después de esto, tenemos todos los datos necesarios y solo queda crear la solicitud en sí, que puede verse así:
SELECCIONE * DE public.book DONDE id EN (SELECCIONE rel1_id DE public.book_categorys_category_books_pivot DONDE book_categorys_category_books_pivot.rel2_id = X) Y id <> Y ORDEN POR random() LÍMITE 3
Donde X es la identificación de la categoría del libro e Y es la identificación del libro en sí.
Tenga en cuenta que esta consulta incluye una subconsulta. Primero, en la tabla book_categorys_category_books_pivot (se utiliza para almacenar información sobre las relaciones entre dos tablas), se encuentran todos los identificadores de libros correspondientes a la categoría seleccionada. Después de esto, se ejecuta una consulta que encuentra al azar 3 libros que coincidan con el rango especificado, excluyendo el ID del libro, cuyo título se pasó originalmente al proceso comercial.
Para un estudio más detallado de la estructura de la base de datos del proyecto, puede utilizar el botón Abrir base de datos en la configuración de Implementar planes.
Le permitirá abrir la base de datos en el editor y obtener acceso directo para ver y editar datos. Sin embargo, debe tener cuidado y tener en cuenta el hecho de que cambiar la estructura de datos en el editor hará imposible seguir publicando el proyecto.
Volvamos a la creación de un proceso de negocio. Es necesario completar la compilación de la solicitud y, para ello, convertir el ID del libro y la categoría de un número entero a una cadena y también ensamblar la solicitud final utilizando el bloque Concat Strings (Multiple).
El último paso es ejecutar la consulta, convertir el resultado en un modelo y enviarlo al bloque Final como resultado de la consulta.
Puede guardar sus cambios, crear un punto final, publicar su proyecto y verificar que la solicitud funcione correctamente. En este caso, se utilizó un bloque SQL Exec con una consulta compuesta compleja para reemplazar muchos otros bloques y simplificar la estructura del proceso de negocio.
El uso del bloque SQL Exec no se limita a la recuperación de datos y se puede utilizar en una amplia variedad de escenarios. Echemos un vistazo más de cerca a algunas opciones más.
- Contando el número de comentarios de un libro con id=X
SELECCIONE RECUENTO (id) DE public.comment DONDE book_id = X - Cálculo de la calificación media de un libro, teniendo en cuenta todas las calificaciones dadas en los comentarios:
SELECCIONE AVG (tasa) DE public.comment DONDE book_id = X - Eliminar todos los comentarios escritos antes de 2023 (se puede utilizar, por ejemplo, para borrar rápidamente el registro).
ELIMINAR * DEL comentario público DONDE creado_en < '2023-01-01'
En conclusión, vale la pena señalar que para mejorar la seguridad, se ha agregado un filtro al bloque SQL Exec para operaciones peligrosas que pueden provocar cambios en el esquema.
CREATE/ALTER/DROP/TRUNCATE para TABLE|COLUMN|INDEX|CONSTRAINT|SEQUENCE|SCHEMA|DATABASE están deshabilitados por el filtro si la aplicación está alojada en servidores AppMaster. Cuando se aloja en las instalaciones, de forma predeterminada, cualquier solicitud está disponible sin restricciones.