Contenido del curso
Gestión de modelos en el backend con el ORM Diesel
- 2

Qué es un ORM y por qué usar Diesel
02:55 min - 3

Errores Comunes al Instalar y Usar Diesel en Rust
00:31 min - 4

Instala Diesel ORM en tu proyecto Rust
05:16 min - 5

Modelo Post con Diesel y PostgreSQL
14:22 min - 6

Cómo insertar datos en Diesel con Rust
07:55 min - 7

Queries SELECT con filtros en Diesel
08:16 min - 8

Cómo editar registros con Diesel en Rust
04:40 min - 9

Borrar registros en Diesel con filtros
03:01 min
Actix web framework (controlador)
Tera templates (vistas)
Despliegue del proyecto
Continúa tu aprendizaje
Mostrar datos de PostgreSQL en Actix
Resumen
Conectar una base de datos a un servidor web en Rust puede sonar complejo, pero con Actix se vuelve manejable si entiendes el flujo correcto. Aquí aprenderás cómo mostrar datos de PostgreSQL en Actix usando Rust, validar errores con match y devolver respuestas legibles al navegador. Es contenido pensado para quien ya instaló Actix y necesita dar el siguiente paso: leer registros y enviarlos al frontend.
Cómo preparar la ruta index y el pool de conexiones en Actix
Antes de tocar la base de datos, necesitas dejar lista la ruta principal y un mecanismo que mantenga vivas las conexiones.
Lo primero es renombrar la función del handler como index, que es el nombre convencional para la ruta raíz. Después se define un nuevo tipo público llamado dbPool, que actúa como contenedor de conexiones gestionadas por r2d2.
¿Qué es un pool de conexiones? Es un contenedor que mantiene varias conexiones abiertas a la base de datos para reutilizarlas. Así evitas abrir y cerrar conexiones en cada petición, lo que mejora el rendimiento.
Piensa en el pool como un arca: dentro viven los connection managers listos para responder cuando una petición los necesite. Esta analogía ayuda a entender por qué la sintaxis de r2d2 parece envolver tantas capas: cada una protege y administra el acceso concurrente.
Cómo inyectar el pool en el handler
Al handler index se le agrega un parámetro de entrada llamado pool, tipado como web::Data<dbPool>. Ese web::Data referencia el data que se registró previamente al iniciar el servidor, y le da al endpoint acceso directo a la base de datos.
Dentro del handler se crea la variable let conn = pool.get(), y si falla, se devuelve el mensaje "Problems fetching the database".
Cómo ejecutar una query con web::block y validar errores con match
La lectura de datos en Actix no se hace directamente: hay que bloquear el thread para evitar condiciones de carrera.
Esto se logra con web::block, una utilidad propia del framework que aísla la ejecución de la query. Dentro se hace un move y se corre la consulta Posts.load, especificando el tipo Post y pasándole la conexión conn obtenida del pool.
El resultado pasa por un match con dos ramas:
- Ok(data): la query devolvió registros correctamente.
- Err(err): ocurrió un error al recibir los datos.
¿Por qué usar match en Rust para queries? Porque las operaciones que pueden fallar devuelven un
Result. Elmatchte obliga a manejar tanto el caso exitoso como el error, evitando que tu servidor crashee silenciosamente.
Al no llevar punto y coma al final, el match se convierte en el valor de retorno de la función. Si vienes de otro lenguaje y eso te confunde, puedes escribir return explícito con punto y coma; ambas formas son válidas.
Errores comunes al conectar Actix con PostgreSQL
Durante la implementación aparecen tropiezos típicos que conviene anticipar.
- Olvidar importar el
schemadel proyecto. - Olvidar importar el modelo con
self::models::Post. - No agregar
awaital final del bloqueweb::block, ya que se trata de una operación asíncrona que espera respuesta del thread bloqueado. - Introducir datos inválidos en el archivo
.env, lo que provoca un panic indicando que la conexión no fue posible.
Resolver estos detalles permite que el servidor compile y responda en el navegador con el mensaje "We have found data".
Cómo mostrar los posts reales en el navegador con format
Devolver "hemos encontrado datos" no aporta valor. El siguiente paso es mostrar el contenido real de cada post.
Dentro de la rama Ok del match, se abren llaves para ejecutar varias instrucciones. Primero se usa println! con el truco de pasar data para depurar en consola y confirmar que llega un arreglo de posts.
Luego se itera con for post in data, construyendo una variable response de tipo String que arranca vacía. En cada vuelta se reasigna usando la macro format!, que es la forma idiomática en Rust de concatenar strings con interpolación de valores.
Dentro de format! se inserta post.title y post.body, de modo que la respuesta acumule el contenido legible de cada registro.
Por qué format es mejor que println para devolver respuestas
Después de probar, hay un patrón más limpio: usar directamente format! como valor de retorno del handler.
println! imprime en la terminal del servidor pero no devuelve nada útil al cliente. format! hace lo mismo en términos de interpolación, pero retorna un String que Actix puede enviar como respuesta HTTP.
Así, al recargar el navegador, aparecen el título, el slug y el body del post directamente en la pantalla. Si tuvieras un frontend consumiendo ese endpoint, ya podría leer y renderizar los posts sin lógica adicional en el servidor.
Conceptos y herramientas clave de la clase
Estos son los elementos técnicos que vale la pena fijar para seguir avanzando con Actix y Diesel.
- dbPool y r2d2: tipo público que encapsula el manejador de conexiones reutilizables a PostgreSQL.
- web::Data: mecanismo de Actix para compartir estado, como el pool, entre handlers.
- web::block: bloquea el thread actual para ejecutar operaciones síncronas como queries de Diesel sin generar race conditions.
- match con Ok y Err: patrón de Rust para manejar el
Resultque devuelven las operaciones que pueden fallar. - Posts.load::<Post>(&conn): consulta de Diesel que carga todos los registros de la tabla posts.
- format! macro: concatena e interpola strings devolviendo un
String, ideal para construir respuestas HTTP. - await: necesario al final de
web::blockporque la operación es asíncrona.
¿Ya lograste mostrar tus propios posts en el navegador? Cuéntame en los comentarios qué error te apareció primero y cómo lo resolviste.