Flujos de base de datos y desarrollo de API con Prisma

Rate this content
Bookmark

Prisma es un ORM de código abierto para Node.js y TypeScript. En esta masterclass, aprenderás los flujos de trabajo fundamentales de Prisma para modelar datos, realizar migraciones de base de datos y consultar la base de datos para leer y escribir datos. También aprenderás cómo Prisma se integra en tu stack de aplicaciones, construyendo una API REST y una API GraphQL desde cero utilizando SQLite como base de datos.


Tabla de contenidos:
- Configuración de Prisma, modelado de datos y migraciones

- Explorando Prisma Client para consultar la base de datos

- Construyendo rutas de API REST con Express

- Construyendo una API GraphQL con Apollo Server

98 min
14 Feb, 2022

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Bienvenido a la masterclass de Flujos de base de datos y desarrollo de API con Prisma. Prisma es un ORM que te permite trabajar con una base de datos relacional desde un lenguaje de programación orientado a objetos. La masterclass cubre temas como el modelado de datos, las migraciones, el uso de Prisma Client para consultar la base de datos y la implementación de APIs REST y GraphQL. También destaca los beneficios de Prisma, incluyendo su intuitivo lenguaje de modelado de datos, su cliente de base de datos seguro en cuanto a tipos y su herramienta de migración. La masterclass proporciona tareas prácticas y orientación para principiantes para comenzar con Prisma.

Available in English

1. Introducción al taller de Prisma

Short description:

Bienvenido al taller de Flujos de Base de Datos y Desarrollo de API con Prisma. Hoy, te presentaré Prisma y cubriré los flujos de trabajo más importantes para construir una aplicación con Prisma. Comenzaremos configurando Prisma con una base de datos SQLite, luego aprenderemos sobre el modelado de datos, migraciones y cómo usar Prisma Client para consultar la base de datos. También exploraremos cómo implementar APIs REST y GraphQL utilizando Prisma Client. No se requiere conocimiento previo, ya que proporcionaré los recursos y la guía necesarios. Siéntete libre de hacer preguntas y seguir mientras explico cada lección antes de darte tiempo para trabajar en las tareas. Soy Nikolas, el anfitrión de este taller, y puedes contactarme en Twitter, GitHub, correo electrónico o en el Slack de Prisma. Este taller es gratuito para que lo uses y compartas con otros.

Bienvenido al taller de Flujos de Base de Datos y Desarrollo de API con Prisma. Estoy realmente emocionado de dar este taller hoy. De hecho, este tipo de talleres son la parte favorita de mi trabajo como defensor del desarrollador que trabaja en Prisma para trabajar con personas y mostrarles sus primeros pasos con Prisma. Y eso es exactamente lo que harás hoy. Así que no necesitas ningún tipo de conocimiento previo sobre SQL o TypeScript o cualquier otra cosa. Comenzaremos desde cero e introduciré todos los conceptos relevantes para que no necesites saber nada de antemano.

Una cosa que les pediría a todos ustedes que hagan es abrir este enlace que ahora también estoy dejando en el chat para que puedan ver también este documento de Notion que estoy usando aquí ahora mismo. Y solo por logística, tengo una segunda pantalla aquí a mi izquierda donde estoy monitoreando el chat. Así que perdónenme si no siempre estoy mirando directamente a todos ustedes. Solo estoy revisando lo que está sucediendo en el chat y si las cosas no funcionan o si tienen una pregunta, siempre pueden dejarla en el chat o porque como ya mencioné, hacemos una llamada regular de Zoom aquí. También pueden desactivar el silencio y hacer una pregunta. Así que eso es definitivamente posible aquí también. Un problema es que Notion SO no funciona para encriptar. En realidad, no tengo otra fuente. No he tenido problemas hasta ahora con Notion, pero tampoco es demasiado importante si no puedes abrirlo tú mismo porque voy a guiar a todos a través del documento. Y lo que puedo hacer es exportarlo como PDF. Puedo hacer eso más tarde cuando comiences a trabajar en tu primera tarea y luego puedo enviarte el documento en formato PDF. Así que deberíamos poder resolver eso. Muy bien. Así que bienvenidos de nuevo, Flujos de Base de Datos y Desarrollo de API con Prisma. Entonces, lo que vas a aprender hoy son básicamente los flujos de trabajo más importantes que debes conocer cuando quieres construir una aplicación con Prisma. Y explicaré un poco más adelante qué es exactamente Prisma y qué hace. Pero primero quiero darte una visión general de lo que vamos a cubrir en este taller. Así que primero comenzaremos configurando Prisma con una base de datos SQLite. Aprenderás sobre el modelado de datos con Prisma y cómo realizar migraciones de base de datos. Luego aprenderás sobre Prisma Client, un generador de consultas con tipos que se puede usar para consultar tu base de datos. Y explorarás varias consultas allí desde operaciones CRUD básicas hasta consultas de relaciones y filtros y paginación. Y luego aprenderás cómo puedes usar Prisma Client para implementar las rutas de una API REST y luego también los resolvers de una API GraphQL. Y no es necesario que sepas cómo se ve una API REST o cómo se ve una API GraphQL. He preparado un poco el esqueleto de los proyectos con los que vas a trabajar. Así que si no has escuchado hablar de qué es un resolver de GraphQL por ejemplo, eso no es un problema en absoluto para este taller. Ahem, este es el programa de alto nivel. De hecho, me di cuenta de que todo comienza una hora antes. Así que debería comenzar a las cuatro y luego agregar una hora cada vez. ¿Cómo es una lección? He preparado estas cuatro lecciones que se corresponden con las diferentes cosas que queremos hacer en el taller. Así que configurar Prisma, modelado de datos y migraciones, explorar Prisma Client, API REST y API GraphQL. Son las lecciones. Y cada lección se ve de la siguiente manera que al principio voy a dar una explicación de la lección. Así que por ejemplo, para la primera aquí, hago clic en ella y luego voy a explicar qué se supone que debes hacer en esa lección en particular. E incluso te mostraré aquí con mi terminal, con mi VS code, un poco de la tarea en la que vas a trabajar. Y después de haberte mostrado tal vez tres o cuatro tareas por lección, tendrás tiempo para trabajar en las tareas de esa lección por ti mismo. Y lo que realmente quiero enfatizar para todos ustedes aquí para aprovechar al máximo este taller es que no comiencen a codificar cuando todavía soy yo quien está dando la explicación. Así que creo que es mejor si cuando te muestro cómo va a ser una lección, cuando explico las tareas individuales solo prestes atención y plantees cualquier tipo de preguntas que se te ocurran, pero realmente concéntrate en las cosas que hago, en lo que digo, e intenta entender eso. Y después de eso, tendrás mucho tiempo para terminar estas tareas por ti mismo. Así que sé un poco paciente cuando explique cada tarea y cada lección y luego aprovecharás al máximo el taller para ti mismo.

Mi nombre es Nikolas, soy el anfitrión de este taller. Realmente me gusta educar a otros desarrolladores y como defensor del desarrollador de Prisma, ese es básicamente mi trabajo principal. Y puedes seguirme en Twitter, en GitHub, puedes enviarme un correo electrónico o también puedes encontrarme en el Slack oficial de Prisma. Una nota final antes de sumergirnos en los temas es que este taller, este documento de Notion es completamente gratuito para que lo uses si quieres dar este taller por ti mismo en algún momento. Así que si sientes que lo que has aprendido en este taller hoy es realmente valioso y te gustaría compartirlo tal vez con tus colegas o amigos y como algunos de ellos están dispuestos a pasar unas horas contigo en esto puedes reutilizar todos estos materiales que he reunido aquí y usarlos cuando estés dando este taller tú mismo.

2. Introducción a Prisma

Short description:

Antes de comenzar con las lecciones, permíteme darte una visión general de qué es Prisma. Visitaremos el sitio web de Prisma y exploraremos la página de inicio juntos. Siéntete libre de hacer preguntas y unirte a la conversación sobre bases de datos y mapeadores objeto-relacional.

Muy bien, creo que eso es todo con la visión general de la logística. Muy bien, antes de comenzar con las lecciones reales me gustaría dar rápidamente una visión general de qué es Prisma en realidad. Y la forma en que quiero hacerlo es simplemente visitando el sitio web de Prisma. y darles a todos un recorrido rápido por nuestra página de inicio porque creo que eso probablemente sea más instructivo aquí. Y si tienen alguna pregunta en el camino también siéntanse libres de activar el sonido y participar, quiero que esto sea lo más interactivo posible. Y si queremos tener una conversación aquí sobre bases de datos y mapeadores objeto-relacional eso está totalmente bien para mí también. Así que si alguien aquí tiene opiniones fuertes sobre este tema, siéntanse libres de unirse a mí aquí.

3. Descripción general de Prisma

Short description:

Prisma es un ORM que te permite trabajar con una base de datos relacional desde un lenguaje de programación orientado a objetos. Proporciona un lenguaje de modelado de datos intuitivo y sencillo para describir el esquema de tu base de datos. Con Prisma Client, puedes consultar la base de datos utilizando un cliente de base de datos seguro en cuanto a tipos. Prisma también ofrece una herramienta de migración, Prisma Migrate, para realizar un seguimiento de los cambios en el esquema de la base de datos. Si bien Prisma se utiliza comúnmente en el backend para implementar consultas contra la base de datos, los desarrolladores frontend también pueden utilizarlo con frameworks como Next.js o Remix que permiten la ejecución de código en el lado del servidor.

Muy bien, entonces Prisma es un ORM. ORM es una abreviatura que significa Mapeador Objeto-Relacional. Y aquellos de ustedes que han trabajado con bases de datos relacionales probablemente también hayan trabajado con un ORM. ¿Qué es básicamente un ORM? Es una herramienta que te permite trabajar con una base de datos relacional desde un lenguaje de programación orientado a objetos. Así que la O significa objeto y la R significa relacional. Y eso se debe a que la herramienta, el mapeador objeto-relacional, mapea las estructuras de datos de la base de datos relacional al lenguaje de programación orientado a objetos.

Y Prisma es un nuevo tipo de ORM que no se puede comparar con otros ORMs del espacio, por lo que es posible que hayas oído hablar de bibliotecas como SQLized o TypeORM que pertenecen a la generación anterior de ORMs donde defines tus tablas como clases de modelo. Y luego instancias estas clases de modelo para consultar la base de datos. La forma en que Prisma funciona es bastante diferente y hoy experimentarás cuáles son esas diferencias.

En primer lugar, creo que lo que realmente es una fortaleza de Prisma es la forma en que modelas los datos con él porque tenemos un lenguaje de modelado de datos muy intuitivo y sencillo que te permite describir el esquema de tu base de datos. Y aquí tienes un ejemplo de cómo se ve eso. Creo que es mucho más legible que si usaras clases de TypeScript, por ejemplo, con decoradores donde hay mucho ruido. Y aquí realmente tienes solo la información esencial que necesitas para definir tus estructuras de datos. Una vez que hayas definido tu modelo de datos, puedes consultar tu base de datos con Prisma Client, un cliente de base de datos seguro en cuanto a tipos. Y eso también es gran parte de la masterclass que estamos haciendo hoy para que te familiarices con la API de Prisma Client, aprendas qué tipo de consultas puedes enviar a la base de datos y cómo usar Prisma Client en general. Y casi todos los mapeadores objeto-relacionales también vienen con una forma de crear migraciones en tu base de datos. Y esa migración es realmente importante cuando, con el tiempo de tu proyecto, el esquema de la base de datos cambia y luego necesitas hacer un seguimiento del historial de estos cambios en el esquema de tu base de datos. Y eso es para lo que sirven las migraciones. Y con Prisma Migrate, una de las herramientas que contiene Prisma, realmente tienes facilidad para hacer un seguimiento de las migraciones que ocurren en la base de datos. Y si nos alejamos a un nivel muy, muy alto solo para que todos estemos en la misma página, supongo que aquellos de ustedes que prefieren trabajar en el backend o tal vez desarrolladores full stack que ya tienen experiencia en la construcción de su propio servidor, su propia aplicación en el lado del servidor, ya tienen una buena comprensión de que aquí es donde se utiliza Prisma, ¿verdad? Se utiliza en el backend para implementar las consultas contra la base de datos. Si eres solo un desarrollador frontend, es poco probable que uses Prisma directamente porque no es algo que usarías dentro de tu aplicación React. Sin embargo, con nuevos frameworks, como Next.js o Remix que normalmente te brindan la oportunidad como desarrollador frontend de ejecutar algún tipo de código en el lado del servidor, ya sea a través de la generación estática del lado del servidor o un renderizado del lado del servidor, o un Next.js con rutas de API. Ahora hay muchos mecanismos diferentes que permiten a los desarrolladores frontend utilizar Prisma también en el marco de su elección, pero solo cuando estos frameworks realmente permiten ejecutar código en el lado del servidor en cierta capacidad. Ahí es cuando usarías Prisma también en un framework frontend. Pero la mayoría de los casos de uso de Prisma, diría que están típicamente en el backend al construir un servidor de API. Y creo que eso también se refleja en las tecnologías populares que hemos enumerado aquí que en su mayoría son tecnologías de backend.

QnA

Sumergiéndonos en las Lecciones y Configurando Prisma

Short description:

Sumergámonos en las lecciones, comenzando con la configuración de Prisma. El objetivo es familiarizarse con el modelado de datos de Prisma y realizar la primera migración de la base de datos. Hay una pregunta de Amal sobre JavaScript full-stack, y recomiendo Redwood JS o Next.js para tu proyecto. La implementación no se cubre en esta masterclass, pero puedes utilizar cualquier proveedor de implementación como Heroku o Vercel. Volvamos a la configuración y clonemos el repositorio inicial, instalemos las dependencias de Node y abramos el proyecto en tu editor de texto preferido.

Muy bien, ¿hay alguna pregunta sobre Prisma hasta ahora sobre algo de lo que dije, sobre algo que no está claro sobre la masterclass o deberíamos sumergirnos y comenzar con las lecciones? Así que sigamos adelante y sumerjámonos en las lecciones.

Comencemos con la lección uno y la configuración de Prisma. El objetivo de esta lección es configurar Prisma familiarizarse con el modelado de datos de Prisma y realizar la primera migración de la base de datos.

Oh, hay una pregunta de Amal que puedo responder rápidamente antes de continuar con la lección. Entonces sí, ¿qué pasa Amal? Hola. Hola. ¿Me escuchas bien? Sí, muy bien. Perfecto. Bien, tengo una pregunta que no está relacionada con Prisma, pero relacionada en general con el desarrollo full stack en JavaScript, si puedo preguntar. De acuerdo, perfecto. La cosa es que soy estudiante de informática y tengo mi proyecto este año y en realidad hice un entrenamiento sobre el desarrollo full stack en JavaScript, como el paquete MERN. Y no he tocado el código en seis meses y tengo que empezar ahora mismo y hacer una plataforma de programación de reuniones B2B. Y no sé por dónde empezar, como que es un poco abrumador. Así que necesito un año de anticipación sobre esto. Ya veo. Y dijiste que ya tienes un proyecto de hace seis meses que utilizaba el stack MERN? En realidad, hice un entrenamiento hace seis meses, pero no toqué el código. Han pasado seis meses. Ya veo. Bueno, me parece que lo que estás buscando básicamente es una solución full stack para construir el proyecto que te han asignado. Y lo que recomendaría en realidad es una herramienta llamada Redwood JS, que es un framework full stack que se encarga del front-end y del backend por ti. Podrías investigar sobre eso. He escuchado muchas cosas buenas sobre Redwood. Y hay un par de frameworks similares. Si no necesitas una lógica de negocio muy compleja en el backend, también podrías optar por Next.js, que también te permite ejecutar código en el lado del servidor e integrar rutas de API para que no tengas que construir tu propio servidor express, por ejemplo, porque las rutas de API ya están incluidas en Next.js. Estos son probablemente los dos frameworks que te recomendaría de entrada. Y sí, si tienes preguntas más específicas sobre cómo empezar, también podemos seguir hablando después de la masterclass y estaré encantado de darte más consejos. Sí, claro. Muchas gracias. Lo aprecio mucho. De nada. Gracias. De nada. Gracias. Y te preguntaré después de la masterclass. Genial, perfecto. Otra pregunta aquí de Amandib. ¿También desplegaremos nuestra aplicación hoy, incluida la base de datos de Prisma? Una aclaración aquí, Prisma no es una base de datos. Es solo una capa que puedes agregar a tu base de datos. Y en cuanto a la implementación, eso no está planeado en el alcance de esta masterclass hoy. Para mí, es más importante que aprendas sobre los flujos de trabajo básicos con Prisma y la capacidad de consultar y migrar tu base de datos. Pero no profundizaremos mucho más en términos de desarrollo de aplicaciones porque entonces Prisma es básicamente solo una biblioteca y tu aplicación y no hay nada demasiado específico, por ejemplo, sobre cómo implementar tu aplicación. Entonces, utilizarías un proveedor de implementación como cualquier otra aplicación, como Heroku o Vercel, DigitalOcean, donde prefieras implementar tus aplicaciones en estos días. Y también puedes hacerlo con Prisma cuando lo integres en tu proyecto. Dicho esto, volvamos a la configuración y he preparado este repositorio inicial aquí y estoy siguiendo los pasos que también harás después. Así que estoy copiando este comando para clonar el proyecto inicial. Luego, dentro del proyecto inicial, también tenemos estas instrucciones para instalar las dependencias de Node. Y una vez que hayas terminado con eso, puedes abrir el proyecto en VSCode. Ahora, no es necesario que uses VSCode para esta masterclass. Prisma también funciona, por supuesto, o simplemente con cualquier otro editor de texto que estés utilizando para el desarrollo.

Creando el Modelo de Usuario y Migración

Short description:

Recomiendo usar VSCode por su excelente soporte de Typescript y la extensión de VSCode que construimos para Prisma. Después de configurar tu proyecto e instalar las dependencias, puedes comenzar con la primera tarea. Prisma utiliza archivos schema.prisma para el modelado de datos, donde defines las fuentes de datos y los generadores. Puedes elegir la base de datos que prefieras, como SQLite, Postgres, MySQL, MongoDB o cockroach DB. El bloque generator instruye a Prisma a generar la biblioteca Prisma Client para consultar la base de datos. La tarea implica crear un modelo de usuario con campos de ID, nombre y correo electrónico. El campo nombre es opcional, mientras que el campo correo electrónico es requerido y único. Una vez completada la tarea, puedes expandir la solución y proceder a crear una migración utilizando el comando Prisma Migrate dev. Este comando crea migraciones localmente en desarrollo. La carpeta de migraciones resultante contiene el código SQL ejecutado en la base de datos.

Pero recomendaría usar VSCode porque tiene un excelente soporte de Typescript. También hemos creado una extensión de VSCode que te ayuda con el resaltado de sintaxis, el linting y las correcciones rápidas de los archivos de esquema de Prisma que veremos en un momento.

Una vez que hayas hecho esto y tengas tu proyecto listo aquí e instaladas las dependencias, puedes comenzar con la primera tarea. Y recuerda que tendrás tiempo para trabajar en estas tareas. Por ahora, creo que es mejor que sigas lo que estoy haciendo aquí.

Ya mencioné en la introducción inicial que Prisma tiene una forma muy sencilla de hacer el modelado de datos y siempre se hace en estos archivos de esquema.prisma. Entonces, prisma es la extensión de archivo personalizada que usamos para los esquemas de Prisma. Y en este momento hemos definido dos bloques dentro del esquema. Uno es la fuente de datos y el otro es el generador.

Con la fuente de datos simplemente configuramos nuestra conexión a la base de datos y le decimos a Prisma que queremos usar una base de datos SQLite en este caso. Y también dónde encontrar esa base de datos. Y aquí también podríamos usar, por ejemplo, Postgres o MySQL, los conectores de MongoDB y cockroach DB están actualmente en versión preliminar pero ya puedes comenzar a usarlos. Así que tienes la flexibilidad de elegir la base de datos que prefieras aquí con Prisma.

Y luego también tenemos estos bloques de generador que son bastante interesantes pero por ahora solo quiero señalar el hecho de que le estamos diciendo a Prisma que genere la biblioteca Prisma Client que luego nos permitirá enviar consultas a la base de datos desde nuestra aplicación Node.js. Muy bien.

Veamos la tarea aquí comienza creando el siguiente modelo de usuario con los siguientes campos y elige los tipos de datos que te parezcan más apropiados según la descripción a continuación. Así que tenemos que crear un nuevo modelo aquí y te mostraré cómo funciona en un momento. Y tenemos que agregar estos tres campos, ID, nombre y correo electrónico. Así que voy a continuar. Oh, en realidad podría haber desplegado todas las soluciones aquí solo asegurándome de que estén colapsadas. Cuando comienzas a definir un modelo en Prisma siempre comienzas con la palabra clave modelo. Y es importante tener en cuenta que cada modelo que defines en el esquema de Prisma se mapeará a una tabla dentro de tu base de datos. Entonces, este modelo de usuario se mapeará a una tabla llamada usuario dentro de la base de datos. Luego, para definir un campo en un modelo primero agregas el nombre del campo. Entonces, en este caso, eso estaba predeterminado como ID. El tipo, si miramos la descripción aquí se supone que es un entero de incremento automático y los tipos de enteros los puedo declarar en el esquema de Prisma usando la palabra clave int. Y luego tenemos que decirle a Prisma que este es una clave primaria y también podemos usar el atributo de incremento automático o la función de incremento automático para el atributo predeterminado para llenar automáticamente este campo cada vez que creamos un nuevo registro de usuario. Luego se supone que debemos agregar un campo nombre y un campo correo electrónico. Los haré ambos cadenas de texto, el nombre se supone que es opcional. Y si tengo un campo opcional en la base de datos, puedo anotar el campo en el esquema de Prisma con un signo de interrogación. Y también tenemos el correo electrónico, también es una cadena de texto. Este es requerido en la base de datos. Así que no estoy poniendo el signo de interrogación y también estoy agregando el atributo único aquí. Y ahora, fíjate que también puedo formatear el archivo con la extensión de VSCode de Prisma. Para mí, he configurado esto en el formato, que para mí es opción shift F. En VSCode y ahora mis campos, los tipos de datos y los atributos están alineados en este diseño columnar. Así que una vez que hayas terminado con esta tarea, puedes expandir la solución aquí y ver si estás correcto.

Creando Migraciones

Short description:

Para crear una migración, utiliza el comando prisma migrate. El comando Prisma Migrate dev se utiliza para crear migraciones localmente en desarrollo. Prisma Migrate deploy se utiliza para aplicar migraciones locales a una base de datos de producción. Esta masterclass se centra en el desarrollo local.

Y la siguiente tarea es proceder y crear realmente una migración. Y el comando que vas a utilizar para esto es el comando prisma migrate. Migrate y si ejecutas el comando así, verás todas las diferentes opciones que tienes como subcomandos para Prisma Migrate porque, como Prisma Migrate es un comando que acepta subcomandos y opciones en la CLI. Y en este caso, quiero utilizar el comando Prisma Migrate dev, que se utiliza para crear migraciones localmente en desarrollo. Cuando quieras aplicar tus migraciones locales a tu base de datos de producción en algún momento, es cuando vas a utilizar Prisma Migrate deploy. Pero eso también está fuera del alcance de la masterclass de hoy.

Ejecutando Migraciones y Agregando Datos

Short description:

Después de ejecutar el comando Prisma Migrate dev, se crea una nueva carpeta de migraciones con una carpeta con marca de tiempo que contiene el código SQL ejecutado en la base de datos. Prisma Studio, una interfaz gráfica de usuario para la base de datos, se utiliza para agregar datos a la base de datos. En esta lección se agregan tres registros.

Ahora puedo ejecutar el comando Prisma Migrate dev y también puedo proporcionar el nombre de la migración que se está creando como una opción aquí. Veamos qué sucedió realmente en el sistema de archivos ahora porque han ocurrido algunas cosas.

Vemos que hay esta nueva carpeta de migraciones aquí. Aumentemos un poco más el tamaño de fuente. Y en esta nueva carpeta de migraciones, también tenemos esta nueva carpeta que se llama este número largo que refleja la marca de tiempo actual y luego el nombre de la migración que proporcioné en ella debido a mi primera migración. Y en realidad podemos ver el código SQL que Prisma ha ejecutado en la base de datos.

Así que acaba de ejecutar este código SQL en la base de datos y creó el archivo de la base de datos justo aquí donde se lo indiqué en el esquema de Prisma donde quería que el archivo de la base de datos Dev estuviera. Ahora tenemos una base de datos y una tabla en la base de datos ya. El siguiente paso es crear algunos datos en la base de datos. Y en esta lección, aún no estamos utilizando Prisma Client, sino que estamos utilizando una herramienta llamada Prisma Studio, que es básicamente una interfaz gráfica de usuario para tu base de datos. Y puedes usarla para agregar datos a la base de datos de esta manera. Aquí estoy agregando tres registros y guardando los cambios. Y ahora tengo tres registros en la base de datos que acabo de crear.

Rollbacks and Prisma Client

Short description:

Ahora es posible realizar rollbacks con Prisma Migrate, lo que proporciona una mejor manera de manejar las migraciones hacia abajo. Actualmente no es posible automatizar el comando migrate mientras se edita el archivo Prisma, pero puedes enviar una solicitud de función en nuestro repositorio de GitHub. Puedes cerrar Prisma Studio después de editar los datos o mantenerlo abierto para usarlo más tarde. No cubriremos Prisma seed en esta masterclass, pero puedes encontrar una guía en la documentación de Prisma. No es necesario actualizar a la última versión para la masterclass. En la próxima lección, exploraremos Prisma Client y aprenderemos sobre CRUD, consultas de relaciones, filtrado y paginación. Ejecutarás otra migración para introducir un segundo modelo con una relación con el modelo de usuario. Puedes probar el código con NPM run dev y ejecutar consultas de Prisma Client contra la base de datos.

Hay una pregunta sobre si es posible realizar rollbacks en las migraciones. Me complace compartir que esta es una de las preguntas más comunes que nos hacen en Prisma. Y a partir de la última versión, en realidad tenemos una forma muy buena. Hemos introducido una forma muy buena en Prisma Migrate para trabajar con rollbacks. Así que es posible. Aquí te dejo un enlace a un artículo de blog que lanzamos y que explica cómo funcionan los flujos de trabajo de rollback con Prisma Migrate. La historia corta es que es básicamente una mejor manera de hacer rollbacks y migraciones hacia abajo. Porque con Prisma, no tienes que escribir una migración hacia abajo antes de que las cosas salgan mal, sino que puedes averiguar qué salió mal en una migración en particular y luego decidir si quieres avanzar o retroceder. Y Prisma generará el código SQL necesario para ti. Entonces, en términos de experiencia de desarrollo y en términos de seguridad y confianza en tus flujos de trabajo de base de datos, creo que este fue un gran avance y Prisma ahora admite rollbacks para migraciones de base de datos. Bien, esto ya es el final de la lección uno. Una pregunta de Christian fue si hay una opción para automatizar el comando migrate mientras se edita el archivo Prisma. ¿Te refieres a una carga en caliente para que, básicamente, cada vez que guardes el archivo, se ejecute automáticamente una migración? Así es como interpreto tu pregunta al menos y actualmente no es posible. En el pasado, teníamos un comando así, pero nos deshicimos de él porque resultó ser muy complejo hacerlo correctamente. Creo que esto podría ser un proyecto secundario divertido para cualquiera si está interesado en cómo se ve eso, pero debido a que estás trabajando con una base de datos y los cambios en el esquema de la base de datos son algo delicados al menos quiero decir para ejecutar. Ni siquiera estoy seguro de si es necesariamente deseable tener una herramienta que recoja automáticamente todo lo que escribes y lo ejecute inmediatamente contra la base de datos. Y por lo tanto, en este momento no existe. Si realmente quieres verlo, siempre puedes ir a nuestro repositorio de GitHub y abrir una solicitud de función y presentar un caso allí para que nuestros equipos de producto e ingeniería puedan evaluarlo.

Otra pregunta, ¿podemos cerrar Prisma Studio después de terminar de editar los datos? Sí, definitivamente puedes, pero también puedes mantenerlo abierto y usarlo más tarde, pero también con el mismo comando siempre puedes volver a abrirlo. Así que lo que sea conveniente para ti. Si quieres cerrarlo, definitivamente puedes cerrarlo en VS Code porque, por supuesto, bloquea tu terminal, luego puedes abrir otra pestaña de terminal aquí y eso también debería funcionar. Así que eso depende de ti. ¿También cubriremos Prisma seed? Desafortunadamente, no vamos a cubrir el flujo de trabajo de seeding con Prisma hoy, pero es bastante sencillo. Puedo enlazar una página en la documentación que explica el seeding y sí, es bastante sencillo. Si buscas en la documentación de Prisma sobre seeding, tenemos una guía al respecto y dejaré un enlace a esa guía en el chat. Y luego Evelyn pregunta si debemos actualizar a la última versión de 3.91 a 3.92, no es realmente importante para esta masterclass. Así que si ese mensaje de advertencia te molesta, puedes actualizarlo, pero no es necesario para seguir con éxito esta masterclass. Luego está Norma Moody que también quiere acceder a los documentos en PDF. Permíteme organizarlo muy rápidamente. Dame un segundo y luego continuaremos con la siguiente lección. Vale, ese correo electrónico también está listo. Y hay una última pregunta antes de pasar a la siguiente, oh, en realidad, acabo de darme cuenta de que dejé el enlace de seeding en una conversación privada aquí. Ahora todos deberían poder verlo. Otra pregunta sobre los flujos de trabajo de def- y deploy porque podemos administrar múltiples entornos simultáneamente. Y sí, eso es prácticamente todo. Y también hay algunas barreras de seguridad en el comando migrate-def que te impedirán hacer cosas que nunca querrías hacer o, lo siento, en migrate-deploy. Tienes algunas barreras de seguridad que te impiden hacer cosas que nunca querrías hacer en una base de datos de producción. Y puedes leer sobre estos comandos también en la referencia de la CLI de Prisma aquí, en la sección Prisma Migrate. Así que tenemos mucha documentación sobre todos estos comandos. Muy bien, así que creo que prácticamente todos probablemente ya hayan terminado. Y si no, también puedes continuar después de que haga el siguiente recorrido del anfitrión. Ahora quiero mostrarte cómo empezar con Prisma Client. Sí, mirando la siguiente lección, explorando Prisma Client. El objetivo de esta lección es que te sientas cómodo con tu API de Prisma Client y explores algunas de las consultas de base de datos disponibles que puedes enviar con ella. Aprenderás sobre CRUD, consultas de relaciones, filtrado y paginación, y en el camino ejecutarás otra migración para introducir un segundo modelo con una relación con el modelo de usuario que creaste antes. Una cosa a tener en cuenta es que solo trabajaremos en este proyecto de VS Code que clonaste de mi GitHub y actualmente ya contiene el archivo script.ts, que es realmente solo un script de TypeScript muy simple que puedes ejecutar. Así que si solo quieres probar que funciona, puedes agregar este hello u otra declaración de registro, y luego puedes ejecutarlo con NPM run dev. Y eso simplemente ejecuta el código y el script. Ahora tendrás una serie de tareas para escribir, como ciertos tipos de consultas de Prisma Client. Y después de haber escrito una de estas consultas, puedes ejecutarlas nuevamente contra la base de datos ejecutando el script con el comando NPM run dev.

Escribiendo Consultas con Prisma Client

Short description:

Antes de comenzar a escribir consultas con Prisma Client, quiero darte algunos consejos. Se recomienda que escribas el código tú mismo en lugar de copiar y pegar. Esto mejorará tu experiencia de aprendizaje y te permitirá usar la función de autocompletado de Prisma. Para ver el estado actual de tu base de datos, ejecuta el comando npx prisma-studio. Ahora, vamos a escribir nuestra primera consulta para devolver todos los registros de usuarios. Almacenaremos los resultados en una variable llamada users y usaremos la consulta find many. La siguiente tarea es crear otro registro de usuario con solo un valor de correo electrónico. Usaremos la consulta create one para esto. Por último, actualizaremos un registro de usuario existente agregando un valor para el campo de nombre. Podemos usar la consulta update y la opción where para identificar al usuario a actualizar.

Un par de consejos que quiero señalar antes de comenzar aquí. Realmente quiero recomendarte que escribas tú mismo. Incluso yo tengo que buscar la solución expandiendo el bloque de solución aquí. Aún así, te recomiendo que no copies y pegues el código de ese bloque de solución, sino que lo escribas. Esto tiene un efecto más instructivo y educativo para ti y tu cerebro si realmente escribes estas cosas tú mismo, y también te permitirá experimentar el autocompletado de Prisma, que es una característica muy agradable en general cuando usas Prisma.

Ese es también el segundo consejo, que puedes usar el autocompletado. Te mostraré cómo funciona. Siempre que quieras ver cómo se ve el estado actual de tu base de datos, puedes ejecutar nuevamente el comando npx prisma-studio y explorar tus datos en Prisma Studio.

Muy bien, veamos cómo podemos escribir consultas con Prisma Client. Escribe una consulta para devolver todos los registros de usuarios. Para calentarte un poco, escribe una consulta para devolver todos los registros de usuarios de la base de datos. Imprime el resultado en la consola usando console.log.

Entonces, hagamos nuestra primera consulta. Voy a almacenar los resultados de mi consulta en una variable llamada users, y luego uso la palabra clave await porque Prisma Client devuelve promesas para todas sus consultas. Y aquí ya puedes ver el autocompletado que tenemos disponible al usar Prisma. Y en este momento, muestra muchos de estos métodos de nivel superior de Prisma Client que están todos precedidos por un signo de dólar para evitar conflictos de nombres en caso de que los modelos que definiste en tu esquema de Prisma entren en conflicto con los nombres que dimos a estos métodos de nivel superior. Pero lo más interesante en este momento es esta propiedad de usuario en la instancia de Prisma Client, que ahora nos da acceso a todas las consultas de modelo que puedo ejecutar para este modelo de usuario. Si observo el autocompletado, puedo ver una gran cantidad de consultas diferentes que son posibles aquí. Y en este caso, la apropiada que simplemente devuelve todo si no proporciono ningún otro filtro o paginación es la consulta find many. Y luego hago lo que se me indica, registrar todos los usuarios usando console.log. En este punto, en realidad detendré Prisma Studio, cerraré esto y solo usaré esta terminal. Y ahora puedo ejecutar npm run dev. Y cuando lo ejecuto, básicamente espero ver los tres registros de la base de datos que creé previamente con Prisma Studio impresos en la consola ahora. Y eso es exactamente lo que sucede. Entonces, Prisma Client siempre devuelve objetos de JavaScript en este caso, una matriz de objetos de JavaScript, y en realidad podemos ver el tipo de esa matriz también cuando pasamos el cursor sobre la variable de usuarios aquí. Eso fue muy fácil, muy sencillo. Veamos cuál es la siguiente tarea.

En esta tarea, crearás otro registro de usuario en la consulta de Prisma Client, proporcionando solo un valor para el correo electrónico pero no para el nombre. Y el valor para el correo electrónico debe ser ls.prisma.io. Nuevamente, estoy almacenando el resultado en una variable, estoy usando await, estoy usando el autocompletado para navegar por todas las consultas de modelo en el usuario, y encuentro la consulta create one. Y la opción create, la consulta create, toma un objeto donde ahora puedo proporcionar los datos que quiero proporcionar cuando se crea este registro en la base de datos. Y la tarea dice que solo debo proporcionar un correo electrónico. Y eso está bien porque solo el correo electrónico es realmente necesario. Eso es alice.prisma.io. Nuevamente, lo registraré en la consola de esta manera y ejecutaré npm run dev. Así que eso funcionó. Si ahora volviera a ejecutar find many, para ejecutar find many nuevamente, veríamos una matriz de cuatro usuarios que se están imprimiendo. Pero lo que no puedo hacer, por ejemplo, es ejecutar la misma consulta con alice.prisma.io nuevamente sin un error. Y eso, por supuesto, se debe a que declaramos el correo electrónico como único en nuestro esquema de base de datos de Prisma. Entonces, si ejecuto esto, para demostrarte mi punto aquí, npm run dev, estoy ejecutando el script nuevamente. Veo un error y el mensaje de error dice que se produjo un fallo en la restricción única en los campos de correo electrónico, lo cual es cierto, ¿verdad? Estamos violando las restricciones únicas que definimos en el esquema de Prisma. Y por eso no podemos ejecutar esto dos veces con el mismo correo electrónico al menos. Muy bien, la siguiente consulta es una consulta para actualizar un registro de usuario existente. En esta tarea, actualizarás el registro de usuario que acabas de crear y agregarás un valor para su campo de nombre. Así que sigamos adelante y hagámoslo. Por supuesto, tendré que cambiar mi consulta aquí. La actualización parece ser la consulta de modelo adecuada para usar aquí. Y ahora, además de los datos que quiero proporcionar, quiero establecer el nombre de este usuario como Alice, pero también necesito identificar al usuario que acabo de crear. Y eso lo puedo hacer agregando esta opción where aquí. Y lo que es muy bueno de usar Prisma Client de esta manera es que where ahora acepta todos los campos de tu modelo de Prisma que se declaran como únicos, y estos son ID y correo electrónico.

Actualización de Registro y Establecimiento de Nombre

Short description:

El campo ID no se declara explícitamente como único porque ya está implícito en el atributo ID, que sirve como identificador único y clave primaria para el modelo. El campo nombre de un registro se puede actualizar utilizando el correo electrónico como referencia. En este caso, el campo nombre se establece como Alice para el registro con el correo electrónico especificado.

Y si te preguntas sobre el campo ID aquí y te preguntas, pero no lo declaramos explícitamente como único. Eso es cierto, no agregamos el atributo único aquí porque no tenemos que porque único ya está implícito en el atributo ID, que es el identificador único, la clave primaria para ese modelo en particular. Así que por eso no tenemos que agregar único aquí en particular. Y ahora podría usar simplemente el ID de ese registro que acabo de crear, pero en este caso quiero hacerlo por correo electrónico, aliceatprisma.io. Así que estoy ejecutando esto y ahora el nombre está establecido como Alice en el mismo registro que acabo de crear.

Creación del Modelo de Publicación y Migración

Short description:

Creemos una migración y un segundo modelo llamado publicación. El modelo de publicación tendrá campos para título, contenido, publicado y autor. El campo título es una cadena requerida, mientras que el campo contenido es opcional. El campo publicado indica si una publicación está publicada o no, con un valor predeterminado de falso. El campo autor es una relación con el modelo de usuario, utilizando el ID del autor como clave externa. Ambos lados de la relación deben definirse en el esquema de Prisma. Al ejecutar la migración se creará una nueva tabla de publicaciones en la base de datos.

Continuemos con la siguiente tarea aquí y eso es crear una migración y un segundo modelo o primero el segundo modelo, luego la migración en ese orden y estamos agregando un modelo de publicación. Así que estoy usando la palabra clave modelo nuevamente, llamo a este modelo publicación y esta primera parte, puedo copiar y pegarla. Todos mis modelos tendrán esta configuración para sus campos ID y ahora veamos qué más tenemos que agregar allí. Así que debemos agregar el título, el contenido, un campo publicado y un campo de autor en la publicación. Entonces, comencemos, el título será una cadena y requerido en la base de datos, así que sin signo de interrogación. El contenido es el cuerpo del contenido de la publicación, este campo debería ser opcional en la base de datos, así que estoy agregando el signo de interrogación. El campo publicado indica si una publicación está publicada o no. Este campo debería ser requerido en la base de datos y por defecto, cualquier publicación que se cree no debería estar publicada. Entonces, ¿cómo puedo representar el estado de publicado o no publicado, con un tipo de dato que es compatible con Prisma con un booleano. Tiene dos estados, está publicado o no publicado y por defecto, quiero que esto no esté publicado, así que estoy agregando falso aquí. Y luego también quiero que cada publicación tenga un autor y un ID de autor. Así que comenzaré con el ID de autor y este ID de autor ahora en realidad es una referencia a este campo ID en el modelo de usuario. Explicaré más adelante qué significa exactamente eso. Y luego, además de eso, también puedo declarar estos campos de usuario o tengo que declarar este campo de usuario como campos de relación. Así que tengo que marcarlo con el atributo de relación y así es como se configura en Prisma cuando dos modelos están relacionados entre sí. Bajo el capó, luego se utiliza como claves externas para esto. Y la forma en que escribes esto es que le dices en el atributo de relación qué campos de tu modelo actual deben ser la clave externa. Así que ese es el ID de autor. Y ahora le dices, a qué campos hace referencia en el modelo de usuario. Y ese es el campo ID en este caso. Y en este momento, Prisma aún no está satisfecho porque Prisma siempre requiere ambos lados de una relación. Entonces, si declaras una relación entre dos modelos, no es suficiente con decir solo en un lado de la relación cómo se supone que debe ser sino que realmente tienes que hacerlo en ambos lados de la relación. También estoy usando el formato nuevamente, y ahora tengo un esquema de Prisma aquí que refleja los cambios con un nuevo modelo y con una relación entre usuario y publicación a través de la clave externa del ID de autor aquí. La relación debería ser opcional. Así que también agregué el signo de interrogación tanto al ID de autor como a los campos de autor y para ejecutar la migración solo estoy usando el mismo comando que antes pero estoy proporcionando un nombre diferente a la migración. Si tienes curiosidad por lo que sucedió en el fondo nuevamente puedes ver el SQL que se generó y realmente solo creó una nueva tabla de publicaciones con un montón de columnas en la base de datos aquí.

Creación de una Nueva Publicación y Conexión con Usuario

Short description:

Escribamos una consulta anidada para crear un nuevo registro de publicación utilizando Prisma Client. Podemos ver el campo de nueva publicación en la instancia de Prisma Client, lo que nos permite invocar consultas para el modelo de publicación. Después de crear la publicación, podemos conectarla a un usuario utilizando una consulta anidada.

Muy bien, permíteme hacer una o dos consultas más con Prisma Client antes de que tengas tiempo para trabajar en esto tú mismo. Así que vamos a escribir una consulta anidada una consulta para crear un nuevo registro de publicación. Aún no es una consulta anidada. Ahora ya puedes ver que en el autocompletado tenemos este nuevo campo de publicación en la instancia de Prisma Client también que nos permite invocar las consultas para el modelo de publicación. Y en este caso, estoy creando una nueva publicación. Nada demasiado complicado aquí. Es lo mismo que hemos hecho antes. Y vemos que la publicación se ha creado. Se imprime y la última consulta que quiero mostrar es cómo conectar un usuario y una publicación con una consulta anidada.

Actualización del Registro de Publicación y Conexión con Usuario

Short description:

Para actualizar el registro de publicación y conectarlo a un usuario existente, podemos utilizar la API segura de Prisma Client. Al encontrar la publicación por su ID y actualizar el campo del autor con el correo electrónico, podemos conectar al autor con la publicación. Esto se puede verificar imprimiendo todas las publicaciones e incluyendo al autor utilizando la opción include. Los comandos console.table y console.dir se pueden utilizar para mostrar los datos, especialmente cuando se trata de objetos anidados.

Ahora tenemos varios registros de usuarios y exactamente un registro de publicación en la database. Estos pueden ser conectados mediante la clave externa del ID del autor. Al utilizar Prisma Client, no es necesario establecer manualmente las claves externas, pero se pueden configurar relaciones utilizando la API segura de Prisma Client. Y queremos actualizar el registro de publicación y conectarlo a un usuario existente a través del correo electrónico. Por lo tanto, en realidad no queremos establecer la clave externa, sino que queremos establecer el correo electrónico. Y aún puedo recordar que es la publicación con ID uno. Así que estoy encontrando la publicación por su ID esta vez. Y luego queremos actualizar el campo del autor. Así que estoy utilizando el campo data dentro del objeto de actualización que proporciono. Y luego puedo navegar a través con el autocompletado que puedo invocar cada vez con Control, Espacio y Conectar. Y quiero conectar al autor mediante el ID. Correo electrónico, lo siento. Estoy ejecutando esto. Y ahora puedo ver que esto fue exitoso porque ahora puedo ver que esto, que antes no estaba después de haber creado el registro, ahora el ID del autor está establecido en cuatro. Y solo para imprimir rápidamente todas las publicaciones que tenemos hasta ahora. Puedo usar find many nuevamente para mostrarte que esta publicación fue creada. Y luego una cosa interesante que explorarás un poco más tarde, pero que ya te estoy mostrando, puedes utilizar la opción include en todas las consultas de modelos de Prisma también para obtener una relación. Entonces, si ahora ejecuto este código, no imprimirá nada porque no tengo una declaración de console log. Publicaciones npm run dev. Puedes ver que imprime el objeto anidado porque estaba obteniendo también al autor para esa publicación en particular. Así que un consejo primero de Alexander fue usar console.table, lo cual creo que es una muy buena idea, especialmente no sé si también funciona con data relacionada, pero a veces también uso console.dir. Permíteme ver cómo imprime la relación aquí. Sí, dice que esto es un objeto. Es agradable imprimir más profundamente, como objetos anidados con este comando con console.dir. En realidad, profundidad nula, no profundidad nula. Sí, perfecto. Así también funciona, y funciona mejor si realmente tienes como dos o tres niveles de anidamiento.

Alias de Campos y Modelos con Prisma

Short description:

Puedes usar el atributo at map en Prisma para crear alias de campos y modelos. Al utilizar el atributo map, puedes especificar diferentes nombres para campos y modelos en la base de datos en comparación con el esquema de Prisma. Esto te permite mantener la consistencia entre la fuente de verdad en la base de datos y las convenciones de nomenclatura utilizadas en tu esquema de Prisma.

Otra pregunta fue de Fernando, ¿qué pasa si quiero crear un campo con un alias? Por ejemplo, almacenarlo en la base de datos como updated at con la escritura en snake case, pero luego quiero nombrarlo en el esquema de Prisma en... Quiero nombrarlo en camel case en el esquema de Prisma. Y Romeo fue amable al responder eso. Es posible con el atributo at map. Así que no voy a cambiar nada en el esquema de Prisma, pero te mostraré cómo funciona sin ejecutar una migración. Entonces, si quisiera hacer esto ahora y tengo este updated at, quiero que sea camel case en mi esquema de Prisma aquí, es de tipo, como daytime. Y luego puedo usar map aquí mismo y decir en la base de datos, quiero que esto se llame updated at. Y de esta manera, cuando Prisma Migrate cree el SQL, en realidad se escribiría en, en snake case aquí también, porque eso representa la fuente de verdad para la base de datos, ¿verdad? Sí, puedes hacer esto con at map en los nombres de los campos para mapearlos a nombres de columnas, pero también puedes hacer esto con los nombres de los modelos y mapearlos a nombres de tablas. Entonces, si quisiera que este modelo de publicación se llame publicación en minúsculas, podría hacer esto. Y ahora sería publicación en minúsculas en la base de datos y PUBLICACIÓN en mayúsculas en mi esquema de Prisma.

Determinación de Relaciones y Abstracción de Base de Datos

Short description:

Romeo preguntó cómo determinar si una relación es de muchos a muchos o de uno a muchos, lo cual se puede ver en el esquema de Prisma al declarar si un campo es una lista o no. La bandera de nombre en el comando Prisma Migrate dev es responsable de nombrar la migración. El autocompletado es la mejor manera de ver todos los parámetros de consulta disponibles, pero la documentación de la API de Prisma también proporciona información completa. Christian preguntó si se puede implementar Prisma en un proyecto que utiliza Mongoose y luego cambiarlo para usar Postgres. Si bien Prisma abstrae las fuentes de datos, no está destinado a ser una abstracción de base de datos única para todos los casos. Se pueden generar modelos a partir de una base de datos existente con el comando Prisma DB pull, que ejecuta una introspección para poblar el esquema de Prisma basado en el esquema de la base de datos.

Luego otra pregunta de Romeo, ¿cómo sabremos si la relación es de muchos a muchos o de uno a muchos? Esto se puede ver directamente dentro del esquema de Prisma, ¿verdad? Porque dentro del esquema de Prisma, se declara si un campo es una lista o no. Entonces, en este caso, en un lado, declaré que hay una lista. Y en el otro lado, declaré que no hay una lista, sino solo un campo o una entrada única. Y por eso podemos saber que es de uno a muchos. Si quisiéramos hacer esto de muchos a muchos, donde un post podría tener varios autores, lo cual sería un caso de uso válido, supongo, podría hacer esto. Y en este caso, tendríamos una relación de muchos a muchos donde ya no almacenaríamos un ID de autor porque Prisma, bajo el capó, crearía una tabla de relación o una tabla de unión para realizar un seguimiento de todos los registros relacionados.

Otra pregunta sobre la bandera de nombre en el comando Prisma Migrate dev. Entonces, la bandera de nombre es responsable de nombrar la migración. Por lo tanto, es lo que se agrega a los directorios de migración que se crean en tu sistema de archivos cuando proporcionas este valor.

La siguiente pregunta es si el autocompletado es la única mejor manera de ver todos los parámetros de consulta disponibles. Si me preguntas, sí, es la mejor manera. Pero no es la única manera. También tenemos una extensa documentación de API para Prisma. Entonces, si vas a nuestra documentación y consultas la referencia de la API de Prisma Client, puedes ver las consultas de modelo para cada tipo de consulta, ya sea para encontrar único o las opciones que se proporcionan para obtener información sobre el tipo de retorno. Así que tenemos una documentación muy completa que enumera todo lo que puedes hacer con todas estas consultas.

Vamos a ver. Más preguntas, una pregunta más de Christian. Digamos que tengo un proyecto de sjs y usa Mongoose. Estoy pensando en cambiarlo en algún momento en el futuro para usar Postgres. ¿Puedo implementar Prisma en mi proyecto? Estoy usando MongoDB. Tal vez cuando llegue el momento, simplemente cambiaré la fuente de datos a Postgres desde el esquema de Prisma. Esa es una muy buena pregunta. Entonces, la pregunta básicamente es si Prisma, si el esquema de Prisma abstrae las fuentes de datos de tal manera que siempre puedes cambiar la base de datos subyacente y seguir trabajando con el mismo esquema. Si entiendo correctamente tu pregunta, creo que esa es su pregunta, de lo contrario, siéntete libre de corregirme. La respuesta a esto es no, no puedes hacer esto. Y en realidad, hay una muy buena razón. Creo que por qué no es posible y por qué no es el caso. El esquema de Prisma no está destinado a ser una abstracción de base de datos única para todos los casos. Reconocemos que cada base de datos y cada tipo de base de datos tiene sus propias fortalezas y debilidades, con sus propias características. Y queremos asegurarnos de que admitamos todas las características de una base de datos cuando construimos un conector de Prisma para ella. Y específicamente, como ejemplo, por qué esto no es posible, si miramos SQLite, por ejemplo, que es una base de datos bastante sencilla en términos de los tipos de datos que admite. Y por ejemplo, en SQLite, no se admite el uso de enumeraciones. Pero las enumeraciones son una parte crucial del modelado de datos cuando trabajas con Postgres o MySQL. En estos otros bases de datos, se admiten las enumeraciones. Eso significa que ahora aquí en mi esquema de Prisma de SQLite, no puedo definir una enumeración, pero si lo cambiara a Postgres donde se admiten, podría usar una enumeración aquí. Pero si cambio esto nuevamente a SQLite, no es posible. Tratamos de asegurarnos de que sin importar qué base de datos uses, puedas aprovechar todas las características subyacentes de la base de datos. Y en tu ejemplo, específicamente Christian, donde estás pensando en cambiar de MongoDB a una base de datos relacional, esto también es mucho más complicado que, por supuesto, en términos de cómo modelaste tus datos en primer lugar en MongoDB. Si estás usando, por ejemplo, muchos documentos incrustados, no hay realmente una buena manera de representarlos en una base de datos relacional. Supongo que en Postgres podrías usar la columna JSON, por lo que esa podría ser una forma de migrar los datos. Pero en general, no es un caso de uso, al menos para el que estamos optimizando, pero si tu esquema de Prisma solo usa características bastante sencillas que también se encuentran en todas las demás bases de datos, supongo que es posible, pero no es realmente un caso de uso para el que estamos optimizando. ¿Hay alguna manera de generar modelos a partir de una base de datos existente como SQLite auto para SQLite? No estoy familiarizado con SQLite auto, pero creo que si entiendo correctamente tu pregunta, sí, hay una forma de hacerlo, lo llamamos introspección. Y básicamente es un comando en la CLI de Prisma, se llama Prisma DB pull que ejecuta la introspección. Y si lo ejecutas contra una base de datos, leerá el esquema de la base de datos. Por lo tanto, examinará las tablas, examinará las columnas y completará el esquema de Prisma para que no tengas que escribir los modelos de Prisma a mano si ya tienes una base de datos existente. Sí, genial. Sí, es muy útil, el comando Prisma DB pull. De hecho, esto también es algo que estamos construyendo actualmente incluso para MongoDB para facilitar que los usuarios actuales de Mongo comiencen. Y, por supuesto, con MongoDB, es un poco más complicado porque en realidad no tienes un esquema, ¿verdad? No es algo que haga cumplir la base de datos en sí. Así que esperamos que los datos que las personas hayan puesto en sus MongoDB sean consistentes. Y luego lo leemos y derivamos las estructuras de modelo de los objetos individuales que las personas tienen en sus bases de datos.

Ejemplo de dbPol y Consultas de Prisma Client

Short description:

Se muestra un ejemplo de cómo funciona dbPol al poblar el esquema de Prisma con modelos que se adhieren a la fuente de datos. Los campos de relación son campos virtuales en el esquema de Prisma que proporcionan una API de cliente de Prisma más amigable al trabajar con relaciones. Pratik preguntó sobre cómo definir el contenido como una cadena y su límite, lo cual depende de la base de datos subyacente. SQLite, por ejemplo, utiliza el tipo de dato texto, mientras que otras bases de datos como Postgres y MySQL te permiten especificar la longitud. Los problemas con la violación de la restricción nula en el campo ID del autor se pueden resolver haciendo que el campo sea opcional. Los problemas con el nuevo modelo que no aparece en el autocompletado se pueden solucionar reiniciando el servidor de TypeScript en VS Code o eliminando y reinstalando los módulos de nodo. El método find unique en Prisma ayuda a encontrar un registro en la base de datos por cualquier propiedad única, incluyendo el ID. En la próxima lección, aprenderás cómo Prisma Client se integra en una API REST o una API GraphQL.

Un ejemplo de cómo funciona dbPol, por supuesto, lo que realmente puedo hacer aquí es mostrarlo rápidamente. Supongamos que tengo un esquema de Prisma vacío aquí, hasta ahora solo he definido la fuente de datos. Y si ahora quiero poblar el esquema de Prisma con los modelos que se adhieren a la fuente de datos, simplemente puedo copiar y pegarlos en la fuente de datos. Que se adhieren a las tablas que ya tengo en la base de datos, puedo ejecutar npx Prisma dbPol, lee la estructura de mi base de datos y crea los modelos para mí.

Lo único que debes tener en cuenta es que estos campos de relación, porque en realidad no existen en la base de datos, ¿verdad? Estos son campos virtuales que solo se colocan en el esquema de Prisma para tener una API de cliente de Prisma más amigable al trabajar con relaciones, pero no existen en SQL. No inferirá nombres inteligentes para ellos, sino que los nombrará según el tipo. Probablemente quieras cambiarles el nombre después de ejecutar un Prisma dbPol para que tengan un poco más de sentido y se ajusten a la capitalización de tus modelos.

Bien, hay una pregunta de Pratik sobre cómo definir el contenido como una cadena y cuál es el límite para los tipos de cadena e int. Esta pregunta es interesante porque no se puede responder solo mirando el esquema de Prisma, ya que los tipos de Prisma son solo abstracciones sobre los tipos de datos subyacentes de la base de datos. En este caso en particular, si miras el post, vemos que se creó como un texto en el fondo. Así que ahora tendrías que buscar en la documentación de SQLite cuántos caracteres se permiten para el tipo de dato texto. Y de hecho, recientemente aprendí esto sobre SQLite. Es especial de SQLite que no hay varchars de un tamaño específico. Entonces, si usas una base de datos SQLite y quieres declarar una columna como varchar de, digamos, 30 caracteres, y luego ejecutas una migración, SQLite en el fondo, en realidad también aceptará el comando porque acepta varchar como una palabra clave. Pero en el fondo, simplemente creará un texto para ti. Un tipo de dato texto. Por otro lado, para Postgres y MySQL y otras bases de datos, puedes enriquecer los tipos de datos que declaras aquí en el esquema de Prisma con atributos de tipo nativo a los que puedes acceder de esta manera. DB en este caso es el nombre de la fuente de datos. Y aquí puedes especificar, por ejemplo, cuánto tiempo se supone que debe ser el título. De esa manera, se aplicará la restricción cuando intentes crear un registro de publicación en la base de datos que tenga más de 256 caracteres.

Bien, creo que todas las preguntas del chat están resueltas. Ya sugeriría pasar a la siguiente tarea, tal vez una rápida muestra de manos de nuevo, aunque espera, no puedo golpear nada con esto. De acuerdo, rápida muestra de manos de nuevo, ¿quién ya ha terminado todo? Una nota rápida para aquellos de ustedes que tuvieron problemas con la violación de la restricción nula en los campos ID del autor, supongo que olvidaron el signo de interrogación aquí. Y de esa manera están haciendo que este campo sea obligatorio. Y lo que Prisma Migrate está tratando de decirte aquí es que estás tratando de agregar una columna requerida a la base de datos, pero eso violaría la consistencia o la integridad de tus datos porque ya tienes un registro de publicación en la base de datos que no tiene un campo para el ID del autor todavía. Entonces, primero tendrías que ir y actualizar todos los registros que ya tienes en la base de datos, establecerles un valor y luego podrías ejecutar esta migración. Pero la forma más fácil es simplemente hacerlo opcional para evitar este problema. Creo que ese debería ser el problema, avísame si no es así.

De acuerdo, problema de Derek sobre el nuevo modelo que no aparece en el autocompletado, pero puedes ejecutar QRIS contra él. Entonces, probablemente sea un problema con la configuración de tu VS code. He visto algunos problemas con eso en el pasado y lo que generalmente ayuda es reiniciar el servidor de TypeScript dentro de VS code. Y la forma en que generalmente hago esto es usando la paleta de comandos con el comando shift P y luego puedo escribir reiniciar TypeScript. ¿Por qué lo quitaron? Tal vez lo hayan renombrado desde la última vez que lo usé, reiniciar el servidor de desarrollo. No, interesante. No sé por qué ya no funciona, por qué no es posible. Otra cosa que puedes hacer es intentar eliminar los módulos de nodo y reinstalarlos, porque eso también regenerará tu cliente y tal vez tus tipos de Prisma se recogerán entonces. Así que eso es otra cosa que podrías intentar, simplemente elimina los módulos de nodo, ejecuta npm install nuevamente y eso debería solucionar tus tipos. Pero sí, es un problema con la configuración de tu VS code. Otra pregunta, ¿siempre tenemos que dar un ID único para encontrar una entidad en find unique? Sí, ese es todo el punto. Como mencioné antes, find unique es un método que te ayuda a encontrar un registro en la base de datos por cualquier propiedad única. Y como mencioné antes, eso podría ser uno donde uses el atributo at unique o simplemente el ID porque es implícito que esto es único. Si solo quieres tener un registro aleatorio, puedes usar find first y en ese caso no tienes que proporcionar un campo único.

De acuerdo, sugiero que sigamos con la siguiente tarea o con la siguiente lección. Dicho esto, en las próximas lecciones, por cierto, también volverás a escribir consultas de Prisma Client. Así que no es el fin del mundo si no completaste todas las consultas de Prisma Client aquí, ahora básicamente aprenderás cómo Prisma Client se integra en una API REST o en una API GraphQL, cómo encaja. Y para eso, vas a escribir consultas de Prisma Client nuevamente. Pero en lugar de ejecutarlas dentro de un script, las agregarás en rutas de API REST y resolutores de GraphQL. Así que volvamos a la página de resumen y pasemos a la siguiente lección.

Configuración de la API REST y Pruebas

Short description:

En esta lección, configuraremos la API REST siguiendo las instrucciones proporcionadas. Restableceremos el proyecto, eliminaremos las migraciones y los archivos de la base de datos, y reinstalaremos las dependencias necesarias. El esquema de Prisma incluye nuevos campos para created at, updated at y view count. El comando npx prisma migrate dev ejecutará la migración y poblará la base de datos. Las tareas para esta lección están marcadas como tareas pendientes en el archivo index.ts. Podemos usar la extensión REST client en VSCode para probar las solicitudes de la API. El servidor Express se puede iniciar con el comando NPM run dev. La consulta de usuarios devolverá todos los usuarios, y podemos probar esto usando el archivo de prueba HTTP. También podemos crear un nuevo usuario implementando la consulta create. También se demostrará el incremento del contador de vistas de una publicación.

Configuración de la API REST. Y primero vamos a seguir todas las instrucciones para la configuración. Aquí proporcioné una serie de comandos que facilitan el cambio a la nueva lección, ya que vamos a trabajar en el mismo proyecto todo el tiempo. También preparé los kits de inicio para la Lección Tres y la Lección Cuatro en diferentes ramas del mismo repositorio. Primero, puedes guardar tu trabajo actual y restablecer todo lo que hayas hecho. Luego puedes cambiar a la rama de la API REST. En realidad, ejecutaré estos uno por uno. Cambiando a la rama de la API REST, hablaré sobre el modelo de datos en un momento. También comenzamos desde cero con nuestra base de datos. Estamos eliminando las migraciones, los archivos de la base de datos SQLite, eliminando todos los módulos de nodo y reinstalándolos. Dicho esto, echemos un vistazo rápido al archivo package.json y veamos qué dependencias tenemos en este proyecto. Es muy sencillo. Solo usamos el cliente Prisma y las dependencias de Prisma que ya teníamos en el proyecto anterior. Luego agregamos Express y los tipos para Express, los tipos para node, TypeScript node y TypeScript porque estamos usando TypeScript aquí. Oh, y en realidad estaba equivocado cuando dije que no usaríamos los flujos de trabajo de seeding porque configuré el seeding aquí para que cada proyecto ya comience con algunos datos en la base de datos. Pero antes de hacer eso y antes de ejecutar eso, echemos un vistazo al esquema de Prisma en este caso. Es muy similar al esquema de Prisma que estabas usando antes. Tenemos los registros de usuario y publicación. Y luego tenemos dos nuevos campos aquí, created at y updated at, que se mantienen en la base de datos, cada uno con valores predeterminados. En este caso, Prisma siempre generará la marca de tiempo actual para realizar un seguimiento de cuándo se creó un registro. Y también este updated at se invocará cada vez que se actualice un registro y escribirá la marca de tiempo actual para realizar un seguimiento de la última actualización de cada registro. Luego también agregamos un nuevo campo llamado view count. Es un número entero y comienza en cero y se utiliza para realizar un seguimiento de cuántas personas han visto una publicación en nuestra aplicación aquí. Para la configuración nuevamente, ejecutemos el comando npx prisma migrate dev. Y una cosa a tener en cuenta aquí es que en el fondo, este comando también invoca el comando prisma dbseed. Y el comando dbseed, a su vez, está mirando el archivo package.json y verifica lo que he definido como mi comando de seeding aquí. Y en este caso, simplemente ejecuta un script de seeding. Y el script de seeding es solo algunos datos aleatorios para que podamos comenzar con esta tarea. Entonces, si ahora abro esto en Prisma Studio, veo que comienzo con una tabla de usuario con tres objetos de usuario, cuatro objetos de publicación. Y también puedo navegar y cambiar las relaciones aquí. Una de las características muy agradables de Prisma Studio es cómo maneja el recorrido y la configuración de las relaciones entre tus modelos. Pero volvamos al documento de Notion y a tus tareas. Para esta lección, encontrarás todas las tareas marcadas como tareas pendientes dentro del archivo index.ts aquí. Y ese archivo ya tiene una serie de comentarios que están marcados como tareas pendientes, y puedes revisarlos y descubrir cuál es la consulta correcta de Prisma Client basada en las instrucciones que ves aquí nuevamente en el documento de Notion. Colapsando en las soluciones aquí. Muy bien. Y la forma en que esto va a funcionar, por cierto, he creado un par de solicitudes HTTP de prueba para ti que puedes usar si instalas la extensión REST client dentro de VSCode. Esto es muy útil cuando necesitas probar APIs REST y no quieres salir de VSCode para hacerlo. Como ejemplo, te mostraré cómo hacer esto con la consulta de usuarios que simplemente debe devolver todos los usuarios. Estoy usando la misma consulta FindMany que estábamos usando en el script anterior. Y ahora puedo iniciar el servidor Express nuevamente, también con el comando NPM run dev y el servidor está listo en el puerto 3000. Y si voy a /users, invocará la ruta de usuarios que acabo de implementar y obtendrá todos los usuarios de la base de datos y los devolverá. Pero para que esto sea aún mejor, puedes usar este archivo de prueba HTTP y también puedes probar esto directamente dentro de VSCode aquí. Entonces, si hago clic en enviar solicitud, también veo la solicitud HTTP que se envió y la respuesta que estoy recibiendo con los datos que estoy esperando de una manera un poco más agradable, un poco más formateada que en el navegador. También podría intentar enviar esta solicitud de publicación para crear un nuevo usuario, pero como aún no he implementado esa ruta y tampoco estoy devolviendo nada, esto en realidad solo se ejecuta en un bucle infinito aquí. Entonces, primero déjame implementar esta consulta para crear un nuevo usuario basado en el nombre y el correo electrónico que recibo aquí, npm run dev, iniciar el servidor, y puedo volver a la prueba HTTP. Ahora hago clic en enviar solicitud nuevamente y veo que se creó el nuevo usuario, el mismo problema que antes en el script que te mostré, si envío estas mismas solicitudes aquí una vez más, nuevamente falla con la violación de la restricción única en el campo de correo electrónico porque no he cambiado el valor del correo electrónico y estaba tratando de crear un segundo registro con el mismo correo electrónico, pero si hago esto y envío las solicitudes nuevamente, entonces creo una segunda entrada solo con un correo electrónico ligeramente diferente. Veamos qué otras tareas hay. Y luego tendrás tiempo para trabajar en ellas por tu cuenta. De hecho, quiero mostrarte esta en particular, el incremento del contador de vistas de una publicación y cómo se hace.

Incrementando Vistas de una Publicación

Short description:

Para incrementar las vistas de una publicación en uno, se utiliza una operación atómica en Prisma. Al proporcionar el ID de la publicación y utilizar la consulta de actualización, se puede incrementar el contador de vistas. Después de reiniciar el servidor, enviar una solicitud a la API incrementará el contador de vistas en uno.

Para eso, estoy utilizando la función app.put en el método put aquí, o llamada de función. Y la ruta es post/ID/views. Lo que sé es que quiero incrementar las vistas de la publicación con este ID que ya hemos extraído de los parámetros de la solicitud. Y quiero incrementarlo en uno. Y la forma de hacerlo en Prisma es utilizando una operación atómica, una operación numérica atómica para ser precisos. Y nuevamente, solo estoy utilizando el autocompletado aquí. Quiero actualizar la publicación y proporciono el ID. Y ahora puedo decir que quiero incrementar el contador de vistas y aumentarlo en uno cada vez que esto se ejecute. Creo que en realidad tengo que hacer esto. Porque sale como una cadena, pero espera un número aquí, así que eso debería funcionar. Detengo el servidor y lo reinicio. Y ahora puedo ir a mi archivo test.http nuevamente y enviar esta solicitud. Y puedes ver cómo en el lado derecho, el contador de vistas se incrementa en uno cada vez que envío esta solicitud a la API.

Implementando Consultas de Prisma Client

Short description:

En esta tarea, tendrás 20 minutos para implementar consultas de Prisma Client y probarlas en VS Code. GraphQL es una forma alternativa de comunicarse con un servidor de API desde el frontend. Permite a los desarrolladores enviar solicitudes al servidor, que realiza la lógica, recupera datos de la base de datos y los devuelve al cliente.

Bien, eso es todo para esta tarea, para esta lección y la guía. Ahora tienes unos 20 minutos nuevamente para implementar estas consultas de Prisma Client tú mismo y probarlas directamente en VS Code. Entonces, lo que básicamente es GraphQL, es una forma alternativa de comunicarse con un servidor de API desde el frontend. Aunque tiene el nombre de QL, que significa lenguaje de consulta, en realidad no es una tecnología de base de datos, sino una tecnología de API. Y es similar a las APIs REST en el sentido de que permite a un desarrollador frontend o un desarrollador móvil enviar una solicitud a una API y luego el servidor de la aplicación realizará alguna lógica, recuperará algunos datos de la base de datos y los devolverá al cliente.

Descripción general de las APIs REST y GraphQL

Short description:

Con REST, tienes diferentes puntos finales y envías varios métodos HTTP. Sin embargo, con GraphQL, solo hay un único punto final donde los desarrolladores frontend envían consultas, eliminando la necesidad de agregar datos de diferentes puntos finales. La configuración de la API de GraphQL implica guardar el trabajo anterior, cambiar a la rama de la API de GraphQL, eliminar migraciones y bases de datos, y reinstalar dependencias. El archivo package.json del proyecto contiene dependencias adicionales, incluyendo Apollo server, GraphQL y GraphQL scalars. El código se encuentra en index.ts y ejecutar el servidor permite explorar la API de GraphQL en un entorno de pruebas. El esquema definido describe las operaciones disponibles, pero la falta de resolutores implementados resulta en errores al enviar consultas. Cada operación en el esquema requiere una función de resolución correspondiente para obtener los datos. La instancia de Prisma Client es accesible a través del contexto, lo que permite el autocompletado y la interacción con la base de datos.

Con REST, típicamente tienes una situación donde tienes varios puntos finales diferentes, ¿verdad? Entonces, en el ejemplo que acabamos de usar nosotros mismos, tenemos todos estos puntos finales diferentes aquí. Tenemos un punto final de usuarios, un punto final de registro, un punto final de publicaciones, un punto final de vistas de ID de publicación. Así que tenemos todos estos puntos finales diferentes y enviamos diferentes tipos de métodos HTTP a estos puntos finales. Así que solicitudes GET, solicitudes POST, solicitudes PUT y también tienes solicitudes DELETE. Así que tienes otros tipos de solicitudes que puedes enviar a estas rutas de la API REST.

Y con GraphQL, no es lo mismo. Con GraphQL, tu servidor de API solo tiene un único punto final y tus desarrolladores frontend y móviles, envían consultas GraphQL a ese único punto final. Y eso hace que muchas de las cosas con las que los desarrolladores frontend suelen lidiar en su trabajo, como agregar datos de diferentes puntos finales o sobreobtener y subobtener datos. Muchos de estos problemas con los que los desarrolladores frontend tienen que lidiar se vuelven obsoletos porque GraphQL te permite definir de manera muy precisa qué datos realmente quieres tener del servidor y de la base de datos como desarrollador frontend. Así que esa es una descripción general de alto nivel. Si quieres aprender más, te lo recomendaría. ¿Cómo lo hago? También he revisado esto en una cosa de Buff girl en NESTJS. Ah, sí. Así que también es parte de NestJS de hecho. Cuando estás usando NestJS, también tienen una integración GraphQL que te permite construir una API GraphQL también. Por eso estaba... Puedes decirlo. Creo que está aquí, ¿verdad? Sí. Sí, sí. Pero hoy no vamos a usar NestJS GraphQL, sino que vamos a usar otra implementación GraphQL en el servidor que se llama SDL-first o Schema-first con Apollo server. De acuerdo. Estaba mezclando esto con el, este GraphQL con Node.js GraphQL. Con Node.js GraphQL. Por eso estaba preguntando eso. De acuerdo, de acuerdo. Muchas gracias. Sí. Y para la próxima lección, esta es la API GraphQL. Voy a repasar el código de configuración nuevamente. Entonces, nuevamente, estamos guardando todo en el que trabajamos antes. Estamos cambiando a la otra rama con la API GraphQL. Estamos eliminando nuestras migraciones y la base de datos y también los módulos de Node y reinstalándolos. El modelo de datos es el mismo que en la lección anterior para la API REST, así que no hay sorpresas esta vez.

Implementación de la API y los Resolvers de GraphQL

Short description:

Para continuar con la configuración, ejecuta nuevamente npx Prisma Migrate Dev con los mismos datos. El archivo package.json incluye dependencias adicionales como Apollo server, GraphQL y GraphQL scalars. El código se encuentra en index.ts. Inicia el servidor y abre el GraphQL playground para explorar la API. Los resolvers para las operaciones definidas en el esquema deben ser implementados. Una vez implementados los resolvers, podrás ver los usuarios en la base de datos. Se pueden utilizar consultas anidadas para obtener datos adicionales, pero se deben implementar resolvers de tipo para las consultas de relaciones. La implementación sigue un patrón sencillo. El servidor utiliza solicitudes POST para las APIs de GraphQL, con la consulta incluida en el cuerpo de la solicitud. El GraphQL playground se puede acceder en localhost:4000.

Y para continuar con nuestra configuración, ejecutamos nuevamente npx Prisma Migrate Dev, y también estamos proporcionando los mismos data nuevamente. Así que echemos un vistazo al proyecto. Aquí está el archivo package.json con algunas dependencias adicionales esta vez. Tenemos Apollo server, GraphQL y GraphQL scalars como dependencias, y luego algunas más que se necesitan para que este proyecto funcione. Nuevamente, todas las dependencias de TypeScript aquí. Y luego todo el código nuevamente se encuentra en index.ts.

De hecho, ya podemos iniciar el servidor, iniciar el servidor aquí, y luego abrir un GraphQL playground, que me permite explorar la API de GraphQL aquí. Y en este momento ya puedo ver qué tipo de consultas están disponibles porque el esquema para mi servidor de GraphQL ya está definido. El esquema se define aquí mismo y eso define todas las operaciones que puedo enviar a mi API de GraphQL. Y aquí en la documentación, el playground, básicamente ves qué operaciones has definido en el esquema. Sin embargo, si comienzo a enviar consultas ahora, si quisiera recuperar todos los usuarios y sus IDs y nombres, entonces obtengo un error y eso se debe a que los resolvers aún no están implementados.

Los resolvers están aquí mismo para cada operación en el esquema que hemos definido. Tenemos que definir una función de resolución correspondiente que sea responsable de obtener los data para estos resolvers, para estas operaciones. Entonces, comenzando con la consulta de todos los usuarios, podemos decir, return Prisma. Y en realidad, tenemos la instancia de Prisma Client adjunta al contexto aquí. Entonces, para obtener el autocompletado, tenemos que usar context.first aquí. Text es nuestra instancia de Prisma Client. Y luego simplemente podemos hacer el findMany como antes. Y nuevamente, tengo que reiniciar el servidor después de hacer un cambio. Está en ejecución. Y ahora puedo ver qué usuarios hay en la database porque el resolver ahora está implementado. Sin embargo, algo a tener en cuenta sobre GraphQL, algo bueno es que puedes enviar consultas anidadas. Así que puedo hacer esto para obtener más información sobre las publicaciones que un usuario ha publicado, pero esto aún no funciona. Así que en realidad deberíamos ver los data aquí, pero solo vemos listas vacías. Y eso se debe a que las consultas de relación deben implementarse a través de estos llamados resolvers de tipo aquí abajo. Y la implementación de estos sigue un patrón bastante sencillo que realmente no tienes que entender si no has trabajado con GraphQL antes. Así que eso está más allá del alcance del taller de hoy. Pero la forma de implementarlos es simplemente encontrar el autor de las publicaciones así que usas una consulta find unique aquí dentro. Identificas las publicaciones actuales por el ID. Y al final, estás usando la API fluida para invocar a ese autor. Y esto es lo mismo para la otra dirección, excepto que aquí estás usando user y posts, y ese es el patrón de cómo siempre implementas estos resolvers de tipo con Prisma. De alguna manera tienes que aprender eso una vez y luego puedes aplicarlo en todas partes. Lo siento, inserté accidentalmente una cadena aquí. De acuerdo, detengo el servidor, lo reinicio. Y ahora, si envío esta consulta anidada, en realidad puedo ver para cada usuario, puedo ver qué publicaciones han publicado ya. Muy bien, eso es prácticamente todo para la explicación de esta parte. Te daré otros 20 minutos para que trabajes en estas lecciones por ti mismo. Y luego, vamos a continuar y concluir el taller de hoy. Disculpa Nicholas y ¿cómo se muestra que estamos usando solicitudes POST para solicitudes GET? Sí, es una muy buena pregunta. En este caso, en realidad siempre estamos usando solicitudes POST porque así es como generalmente funciona GraphQL. Envías una solicitud POST a la API de GraphQL. Y en el cuerpo de esa solicitud POST, incluyes la consulta. Entonces, si abrimos las herramientas de desarrollo aquí e inspeccionamos las pestañas de red, veremos que, por lo tanto, estamos enviando solicitudes POST. Y como carga útil, vemos que se incluye la consulta que está definida aquí en el playground de GraphQL. Oops. De acuerdo, lo entendí. Ah, no sincronices. Sí, y puedes acceder al playground aquí en localhost 4000. Hubo una pregunta. ¿Alguna idea de por qué el autocompletado no funciona en la rama de GraphQL? Anteriormente, funcionaba perfectamente en el objeto de contexto. Esa es una buena pregunta.

Generadores y Elección de Prisma como ORM

Short description:

El concepto de un generador en Prisma es interesante y lo distingue de otros ORMs. Los generadores son funciones que se invocan cuando se llama al comando npm prisma generate. Se pueden utilizar para construir generadores personalizados o utilizar los existentes proporcionados por la comunidad. Por ejemplo, el generador prisma ERD visualiza las relaciones de entidad en un esquema de base de datos. Prisma ofrece integraciones con frameworks y bibliotecas como type GraphQL, que genera resolvers CRUD. Al elegir una biblioteca de base de datos, debes decidir si deseas trabajar con consultas SQL directamente o utilizar abstracciones de nivel superior como Prisma. Los controladores de base de datos simples requieren escribir consultas SQL, mientras que los ORMs como Prisma proporcionan una forma más intuitiva y segura en términos de tipos para interactuar con la base de datos.

Entonces debería funcionar en el objeto de contexto siempre y cuando esté definido como el tipo de contexto aquí. Porque en el tipo de contexto, definimos o definimos la interfaz con un campo llamado Prisma que es de tipo cliente Prisma. Y de esa manera debería funcionar. Y realmente no sé por qué no funciona para ti. Lo siento. Si quieres obtener el autocompletado, quiero decir, en realidad no tienes que usar la instancia del cliente Prisma a través del contexto. Pero lo que también podrías hacer es simplemente dentro de tu archivo index.ts y podrías ir e instanciar el cliente Prisma de esta manera y luego simplemente usar el autocompletado de esta manera nuevamente. Pero en GraphQL es una buena práctica incluir cualquier objeto o cualquier cosa que todos los resolvers necesiten acceder dentro del objeto de contexto. Entonces, como una buena práctica, eso debería hacerse pero supongo que para el proyecto de demostración de hoy no es muy relevante cómo lo hagas.

Muy bien, todos, ¿hay alguna otra pregunta sobre Prisma o el taller de hoy? Quiero empezar a concluirlo lentamente. Ahora, por supuesto, puedes terminar todo en tu propio tiempo. Todas las soluciones están en el documento de Notion de todos modos. Así que mientras tengas acceso a eso básicamente tienes acceso a todos los recursos que necesitabas para este taller. Y también hay nuevamente los detalles de contacto de cómo comunicarte conmigo incluidos en el documento de Notion también.

Hubo una pregunta sobre el generador al comienzo mismo del taller de hoy. Y rápidamente quería volver a eso en realidad porque el concepto de un generador es realmente interesante, creo. Y también nuevamente, distingue a Prisma de otros ORMs. Básicamente, un generador es una función que se invoca cuando alguien llama al comando npm prisma generate. Ahora, en realidad no has usado este comando hoy porque al igual que el comando dbc, se llama internamente cuando ejecutas prisma migrate dev. Por eso nunca tuviste que ejecutar explícitamente este comando por ti mismo. Pero si lo invocas, entonces lo que prisma hace por ti, es invocar todos los bloques de generadores internamente e invocar un bloque de generadores significa que invoca la función asociada con el proveedor. Y el principal que normalmente usas para eso es solo el de prisma client que genera la biblioteca de acceso a datos que hemos estado usando hoy. Pero lo interesante de estos generadores es que también puedes construir tus propios generadores y tenemos una sección completa en nuestra documentación en la sección sobre generadores que enumera varios generadores existentes que han sido construidos por la comunidad. Entonces, por ejemplo, probemos el generador prisma ERD. No lo he hecho en un tiempo, pero espero que esto funcione. Entonces, ERD es un cierto tipo de diagrama para visualizar las relaciones de entidad en tu esquema de base de datos. Y así es el generador prisma ERD. Y si ejecuto npx prisma generate nuevamente. En realidad, primero tengo que instalar el generador en mi proyecto. De lo contrario, no se puede invocar. Y también tenemos integraciones para frameworks y bibliotecas existentes. Por ejemplo, hay un generador de tipo GraphQL prisma que generará todos los resolvers CRUD que necesitas para una API CRUD con un tipo GraphQL, lo cual es realmente útil. Oops, no de nuevo, npx prisma generate. Entonces, veamos cómo se ve cuando genera el ERD, el diagrama de relaciones de entidad, diagrama de relaciones de entidad generado como un archivo SVG. Está bien, eso es un SVG, está ahí, no sé. ¿Puedo, cuál es la forma más rápida de, Visualizar un SVG en realidad. Entonces, esto es lo que se genera a partir de este generador Prisma ERD. Y básicamente, estos generadores son básicamente herramientas que miran tu esquema actual de Prisma y de alguna manera transforman o usan la entrada del esquema de Prisma, tus modelos, para convertirlos en algo más. Y eso podría ser resolvers para APIs GraphQL que pueden ser diagramas, pueden ser validaciones usando la biblioteca Zot. Entonces, muchas cosas diferentes que ya están disponibles aquí pero realmente depende de ti lo que quieras que hagan estos generadores y construir el tuyo propio después de todo. Muy bien, veamos si ha habido nuevas preguntas. Y en pocas frases, ¿por qué deberíamos usar Prisma como ORM en lugar de otras soluciones? Bueno, esa es una pregunta interesante a la que puedo responder rápidamente. En primer lugar, cuando eliges una biblioteca de base de datos para tu proyecto, primero debes decidir si quieres elegir una biblioteca de base de datos donde al final aún tengas que crear consultas SQL. Entonces puedes usar controladores de base de datos simples como NodePG, por ejemplo. Ese es un controlador simple donde instancias un cliente de base de datos de esta manera. Y luego simplemente envías declaraciones SQL a este cliente que escribes como cadenas o usas un generador de consultas como Connect JS donde al final aún estás construyendo consultas SQL pero llamando a funciones. Entonces eso ya está un poco más cerca de lo que hacemos con Prisma, pero al final aún tienes que conocer y estar familiarizado íntimamente con SQL para usar esto. Y si no quieres hacer esto, entonces puedes usar abstracciones de nivel superior, estos llamados mapeadores objeto-relacional, ORMs. Y en el espacio de TypeScript y Node.js, hay realmente dos que son los más populares en este momento.

Comparación con SQLize y TypeORM

Short description:

Prisma ofrece una mejor experiencia de modelado de datos en comparación con SQLize y TypeORM. El esquema de Prisma sirve como la única fuente de verdad para tus modelos de base de datos y aplicación, lo que facilita e intuitivo realizar consultas en tu base de datos. Prisma también brinda un sólido soporte para TypeScript, lo que te permite descubrir consultas mediante autocompletado. Además, Prisma ofrece garantías de seguridad de tipos más sólidas que TypeORM, incluso al seleccionar modelos parciales o incluir relaciones.

Uno se llama SQLize y luego TypeORM. Y tenemos comparaciones tanto para SQLize como para TypeORM en nuestra documentación. Así que si tienes curiosidad de cómo Prisma se compara con estos, también puedes ir a nuestra documentación y consultar la sección de comparación de Prisma aquí con TypeORM y SQLize.

La historia breve, por qué recomendaría Prisma sobre TypeORM y también los principales beneficios que escuchamos de nuestros usuarios en comparación con estas bibliotecas es la forma en que haces el modelado de datos en Prisma es mucho más agradable, una experiencia mucho mejor. Y el esquema de Prisma como la única fuente de verdad para tu base de datos y tus modelos de aplicación, luego la API generada y lo sencillo e intuitivo que es realmente realizar consultas en tu base de datos donde en SQLize o TypeORM, porque tampoco tienen un soporte muy sólido de TypeScript, por supuesto, TypeORM es un poco mejor en ese aspecto que SQLize, pero te encontrarás buscando a menudo en la documentación de la API para descubrir cómo debe ser una determinada consulta con cada una de estas bibliotecas. Y con Prisma, eso no ocurre realmente. Puedes descubrir la mayoría de las consultas simplemente escribiendo y utilizando el autocompletado.

Y otra cosa en realidad es la seguridad de tipos y las garantías de seguridad de tipos que Prisma puede proporcionar. Y tenemos una comparación al respecto con TypeORM, que de lo contrario probablemente sea el ORM más seguro en cuanto a tipos en el ecosistema de TypeScript. Ciertamente mucho más seguro en cuanto a tipos que SQLize. Y aquí estamos explicando varios escenarios en los que Prisma puede proporcionar garantías de seguridad de tipos más sólidas que TypeORM. Por ejemplo, cuando solo seleccionas modelos parciales o cuando incluyes relaciones, esto siempre está fuertemente tipado con Prisma a través de una interesante magia de TypeScript que hacemos internamente. Verás que todos tus árboles de cliente de Prisma, incluso si incluyes relaciones, incluso si seleccionas solo campos específicos, siempre estarán fuertemente tipados. Muy bien. Creo que eso es todo. Y estamos listos para concluir la sesión de hoy.

Watch more workshops on topic

GraphQL Galaxy 2021GraphQL Galaxy 2021
140 min
Build with SvelteKit and GraphQL
Top Content
Featured WorkshopFree
Have you ever thought about building something that doesn't require a lot of boilerplate with a tiny bundle size? In this workshop, Scott Spence will go from hello world to covering routing and using endpoints in SvelteKit. You'll set up a backend GraphQL API then use GraphQL queries with SvelteKit to display the GraphQL API data. You'll build a fast secure project that uses SvelteKit's features, then deploy it as a fully static site. This course is for the Svelte curious who haven't had extensive experience with SvelteKit and want a deeper understanding of how to use it in practical applications.

Table of contents:
- Kick-off and Svelte introduction
- Initialise frontend project
- Tour of the SvelteKit skeleton project
- Configure backend project
- Query Data with GraphQL
- Fetching data to the frontend with GraphQL
- Styling
- Svelte directives
- Routing in SvelteKit
- Endpoints in SvelteKit
- Deploying to Netlify
- Navigation
- Mutations in GraphCMS
- Sending GraphQL Mutations via SvelteKit
- Q&A
React Advanced Conference 2022React Advanced Conference 2022
95 min
End-To-End Type Safety with React, GraphQL & Prisma
Featured WorkshopFree
In this workshop, you will get a first-hand look at what end-to-end type safety is and why it is important. To accomplish this, you’ll be building a GraphQL API using modern, relevant tools which will be consumed by a React client.
Prerequisites: - Node.js installed on your machine (12.2.X / 14.X)- It is recommended (but not required) to use VS Code for the practical tasks- An IDE installed (VSCode recommended)- (Good to have)*A basic understanding of Node.js, React, and TypeScript
GraphQL Galaxy 2022GraphQL Galaxy 2022
112 min
GraphQL for React Developers
Featured Workshop
There are many advantages to using GraphQL as a datasource for frontend development, compared to REST APIs. We developers in example need to write a lot of imperative code to retrieve data to display in our applications and handle state. With GraphQL you cannot only decrease the amount of code needed around data fetching and state-management you'll also get increased flexibility, better performance and most of all an improved developer experience. In this workshop you'll learn how GraphQL can improve your work as a frontend developer and how to handle GraphQL in your frontend React application.
React Summit 2022React Summit 2022
173 min
Build a Headless WordPress App with Next.js and WPGraphQL
Top Content
WorkshopFree
In this workshop, you’ll learn how to build a Next.js app that uses Apollo Client to fetch data from a headless WordPress backend and use it to render the pages of your app. You’ll learn when you should consider a headless WordPress architecture, how to turn a WordPress backend into a GraphQL server, how to compose queries using the GraphiQL IDE, how to colocate GraphQL fragments with your components, and more.
GraphQL Galaxy 2020GraphQL Galaxy 2020
106 min
Relational Database Modeling for GraphQL
Top Content
WorkshopFree
In this workshop we'll dig deeper into data modeling. We'll start with a discussion about various database types and how they map to GraphQL. Once that groundwork is laid out, the focus will shift to specific types of databases and how to build data models that work best for GraphQL within various scenarios.
Table of contentsPart 1 - Hour 1      a. Relational Database Data Modeling      b. Comparing Relational and NoSQL Databases      c. GraphQL with the Database in mindPart 2 - Hour 2      a. Designing Relational Data Models      b. Relationship, Building MultijoinsTables      c. GraphQL & Relational Data Modeling Query Complexities
Prerequisites      a. Data modeling tool. The trainer will be using dbdiagram      b. Postgres, albeit no need to install this locally, as I'll be using a Postgres Dicker image, from Docker Hub for all examples      c. Hasura
Node Congress 2023Node Congress 2023
109 min
Node.js Masterclass
Workshop
Have you ever struggled with designing and structuring your Node.js applications? Building applications that are well organised, testable and extendable is not always easy. It can often turn out to be a lot more complicated than you expect it to be. In this live event Matteo will show you how he builds Node.js applications from scratch. You’ll learn how he approaches application design, and the philosophies that he applies to create modular, maintainable and effective applications.

Level: intermediate

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

GraphQL Galaxy 2021GraphQL Galaxy 2021
32 min
From GraphQL Zero to GraphQL Hero with RedwoodJS
Top Content
We all love GraphQL, but it can be daunting to get a server up and running and keep your code organized, maintainable, and testable over the long term. No more! Come watch as I go from an empty directory to a fully fledged GraphQL API in minutes flat. Plus, see how easy it is to use and create directives to clean up your code even more. You're gonna love GraphQL even more once you make things Redwood Easy!
Vue.js London Live 2021Vue.js London Live 2021
24 min
Local State and Server Cache: Finding a Balance
Top Content
How many times did you implement the same flow in your application: check, if data is already fetched from the server, if yes - render the data, if not - fetch this data and then render it? I think I've done it more than ten times myself and I've seen the question about this flow more than fifty times. Unfortunately, our go-to state management library, Vuex, doesn't provide any solution for this.For GraphQL-based application, there was an alternative to use Apollo client that provided tools for working with the cache. But what if you use REST? Luckily, now we have a Vue alternative to a react-query library that provides a nice solution for working with server cache. In this talk, I will explain the distinction between local application state and local server cache and do some live coding to show how to work with the latter.
Node Congress 2022Node Congress 2022
26 min
It's a Jungle Out There: What's Really Going on Inside Your Node_Modules Folder
Top Content
Do you know what’s really going on in your node_modules folder? Software supply chain attacks have exploded over the past 12 months and they’re only accelerating in 2022 and beyond. We’ll dive into examples of recent supply chain attacks and what concrete steps you can take to protect your team from this emerging threat.
You can check the slides for Feross' talk here.
React Day Berlin 2022React Day Berlin 2022
29 min
Get rid of your API schemas with tRPC
Do you know we can replace API schemas with a lightweight and type-safe library? With tRPC you can easily replace GraphQL or REST with inferred shapes without schemas or code generation. In this talk we will understand the benefit of tRPC and how apply it in a NextJs application. If you want reduce your project complexity you can't miss this talk.
Node Congress 2022Node Congress 2022
34 min
Out of the Box Node.js Diagnostics
In the early years of Node.js, diagnostics and debugging were considerable pain points. Modern versions of Node have improved considerably in these areas. Features like async stack traces, heap snapshots, and CPU profiling no longer require third party modules or modifications to application source code. This talk explores the various diagnostic features that have recently been built into Node.
You can check the slides for Colin's talk here.