Iniciamos con la lógica de creación de categorías utilizando SQLite. La clave es importar los modelos correctos desde nuestra librería interna y usar métodos asíncronos para gestionar las operaciones de base de datos.
// Importamos los modelos desde la librería SQLiteconst{ models }=require('libs/sqlite-lib');// Función para crear una nueva categoríaasyncfunctioncreateCategory(data){const newCategory =await models.Category.create(data);return newCategory;}
Este simple fragmento de código permite la creación de una categoría y asegura que todas las validaciones en el esquema se cumplen, requiriendo un nombre y una imagen para completarse exitosamente.
¿Cómo crear un producto y manejar relaciones uno a muchos?
Para gestionar la creación de productos y establecer las relaciones de uno a muchos, primero integramos nuestro modelo de productos.
// Lógica para crear nuevos productos y establecer relacionesconst{ models }=require('libs/sqlite-lib');asyncfunctioncreateProduct(data){const newProduct =await models.Product.create(data);return newProduct;}
¿Qué ajustes son necesarios en el esquema?
El esquema del producto debe incluir una referencia al ID de la categoría para establecer la relación. Aquí es donde especificamos que un producto debe pertenecer a una categoría en específico.
const productSchema ={name:'string',price:'integer',description:'string',categoryId:'integer',// Hace referencia a la categoría};
¿Cómo consultar productos y categorías con asociaciones?
Una parte vital es consultar los elementos con sus asociaciones correctas. Para ello, hacemos uso de los métodos de búsqueda incorporados:
¿Cuál es el proceso para consultar y obtener un resumen detallado?
Consulta general de productos: Devuelve productos con sus categorías gracias a la inclusión de asociaciones.
Consulta general de categorías: Devuelve solo categorías, sin detalles adicionales de productos, para operaciones ligeras.
Detalle de categoría específica: Cuando se necesita el desglose de un producto, se efectúa una búsqueda más profunda que incluye todos sus productos usando includes: products.
Con estos pasos, es posible gestionar múltiples relaciones uno a muchos, permitiendo crear un flujo de datos más eficiente y coherente dentro de una aplicación en desarrollo. Mantente atento para aprender a manejar relaciones más complejas como son las de muchos a muchos.
Creo que este no es un curso para principiantes.
Es muy sorprendente como navegamos por medio de las relaciones de la base de datos sin siquiera tener un modelo físico a mano para consultarlo y para que el desarrollo de los servicios y los modelos sea más explícito.
Por eso creo que un principiante podría tener algunas dificultades en este curso.
Sin embargo también creo que el profe explica de una manera muy natural como las entidades se relacionan y cómo llegamos a resolver cada escenario.
El tema con el curso es que lleva una secuencia, que por lo general se puede ver en la escuela de Backend con Javascript y puntualmente este curso si se hizo un desarrollo inicial en el curso , tal vez por esa razón se ve que esta avanzado
Si, si estoy de acuerdo en que es un curso avanzado.
Muchachos, es importante agregar el atributo foreignKey al belongsTo que se agrega en la tabla de products. De lo contrario node agrega a los querys una columna que no existe. Por lo tanto todos los querys que intenten fallaran por que no consigue la columna.
.
Si agregas esto en tu clase de associate
this.belongsTo(models.UsersRol,{as:'rols'})// to many users
Lo que sucedera es que node incluye en los script "rolsId" como si fuera una columna, que no fue asignada en el modelo y tampoco existe en la bbdd.
.
Como lo resuelves? Incluye esto.
this.belongsTo(models.UsersRol,{foreignKey:'id',as:'rols'})// to many users
Solo asi me permitio hacer los querys
Gracias Jesús, tenia el mismo problema y esto me ayudo a solucionarlo, alguien tiene idea de por qué sucede esto? El profesor no lo hizo así, e igual le funciono
Importantisimo. Ojalá lo voten más para que suba en los comentarios. Igual les dejo la documentación sobre las asociaciones para que puedan tener mejor referencia de cómo funcionan: https://sequelize.org/docs/v6/core-concepts/assocs/
Al igual que en la relación uno a uno, se hacen las respectivas asociaciones dentro de los servicios de categorías y productos.
Cabe mencionar que se debe modificar el esquema de producto ya que un producto está asociado a un categoryId ya que el esquema de la validación (Joi) debe coincidir con la BD en la llave foránea.
Con esto puedes validar el tipo de excepcion colocando un if de la siguiente manera
if(err instanceofValidationError&& err.isBoom){\\ respuesta
}elseif(err instanceofForeignKeyConstraintError&& err.isBoom){// segunda respuesta}next(err)// Si no se cumple ninguna pasa al siguiente middlelware
Qué crack, jaja. Gracias por el tip!
Qué pasa si una categoría tiene por ejemplo 1,000 productos, en producción al consultar una categoría no sería lenta esta consulta.?
1000 en realidad es poca información, se puede consultar, pero entiendo el punto. Se "dividen" las consultas ejemplo: Paginación o scroll infinito.
Si lo que estás pensando es en big data; mil no es nada, si a lo que te refieres es a las tramas de datos, se usan los parámetros para acotar lo que se busca
Cual sera la razón de que ha y tan pocos aportes y preguntas en esta parte del curso?
Este curso hasta el momento me ha tomado bastante tiempo llegar a esta clase. He tenido un sin numero de inconvenientes al realizarlo, ya sea porque las versiones de la dependencias están muy actualizadas, o que algunas ya no se usan. pero sin duda me ha ayudado a combatir ese sindrome del impostor ya que he buscado alternativas y es gratificante ver que aunque no sea de la misma forma puedo hacer correr el proyecto. un curso realmente Avazando que me hace ver que todo el tiempo que dedique a la ruta de desarrollo web esta dando provecho.
Nunca dejen de aprender compañeros!
bua me encanta lo util y realizta que es el curso
No sé por qué cuando hago las migraciones se crean las tablas vacías en postgress
este curso es excelente
Me aparece este error al crear una categoría:
ValidationErrorItem {
message: 'Category. id cannot be null',
type: 'notNull Violation',
.
cuanlo lo solucione les comparto cual fue la solución.
mmm... no logro comprender porque el ORM quiere enviar el ID al crear una categoría y un nuevo producto:
Tube que agregar en los esquemas de productSchema y categorySchema el id: id.required() en la creación de objetos.
¿A alguien le ha pasado lo mismo?
yo tengo el mismo problema sin encontrar la raiz del problema, alguen podria ayudarnos a resolver este bug
Señalamos las relaciones
Los schemas de la DB y Joi deben coincidir en la foreign key
tengo un problema, quiza alguien vio la solucion pero parece q viene del ORM, resulta que cuando hacemos una migracion en la DB queda excelente pero cuando tiras un get a /categorias me aparece el select en consola y cuando lo observo: noto que tiene incluidas tablas que jamas di la orden de crear o que las selecione, por ejemplo hago un get que seria un select y me dice que updateAt no existe, eso jamas se creo en el modelo, pero sin embargo el GET insiste en q me falta esa columna en la db... rarisisimo
obviamente que voy a la DB y creo esa columna que no existe, pero no es la idea... estoy haciendo un blog desde 0 y me insiste que categoryIdCategory tienen que existir en esa columna de categorias... No entiendo a que se debe esto, el modelo esta re contra verificado y las relaciones tambien, de hecho funciona todo a la perfecion, lo unico random es esto que desconcierrta
Alguien sabe porque mis datos no tienen persistencia? Ademas tengo que hacerle up a docker cada vez que apago la compu porque me sale el exit del puerto
probablemente tienes mal el volumen del contenedor, recuerda que se debe usar un volumen para que persista la información de un contenedor.
Efectivamente tienes que configurar los volúmenes para postgres y pdadmin
Tengo un problema con el ValidationHandler, una vez que mando por post los datos (sin un id de categoría) en vez de que me retorne el error en PostMan (no estoy utilizando insomnia) la aplicación crashea y me tira el error por consola, lo he estado intentando solucionar, pero no encuentro cual es el problema, dejo mi repositorio de Github por si alguien podria ayudarme a encontrar la falla
Creo que en el createCategorySchema debes colocar también el id
Pero eso es para validar que el cliente pasa el id para crear la categoría, y eso no es necesario, la base datos le asigna un id auto incremental
¿Cuál es la diferencia entre los archivos que están en la carpeta /schemas/ y los de la carpeta /db/models/, tienen que tener las mismas variables/objetos ambos archivos?
Los archivos models, son aquellos que va a usar el ORM para crear las tablas en la base de datos.
Mientras que los schemas son los que determinan como se va a hacer la consulta a esa base de datos y que se requiere para hacerla.
Y pese que a que no todas las variables de los models tienen que estar en los schemas, las variables si ayudan a identificar más facilmente la tabla y dato que se quiera manipular
Efectivamente los schemas de la carpeta schemas sirven para validar los datos que reciben los endpoints. En código quedaría más claro si a estos se les llama validators, para eliminar la posible confusión con los schemas de la base de datos, que tiene la información con la que fue construida la tabla, sus columnas y atributos de cada columna. Pero bueno no hay un standard para nombrar a cada capa exactamente varía ligeramente de proyecto a proyecto, como las palabras de país a país
en la terminal corremos el comand: npm docs sequelize // ahí te abre la documentacion de como implementar las querys, no solo como el profe muestra en la clase, es importante curiosear y crear consultas que cotidianamente nos encontraríamos.
que bien explicado el curso, tiene toda mi atención, fabuloso!
Profe Nicolas Molina, me surge un error cuando creo un producto, le agrego la categoryId y de ahí me sale un error not Null Violation me puede ayudar porfavor
el error es porque no estas incluyendo un algun dato, por ejemplo el price,
osea hay un dato que no puede ser nulo, y entonces debes asignarlo,
Alguien me podria ayudar con este error en insomnia:
"message": "relation "Products" does not exist",
"stack": "Error\n at Query.run (C:\Users\Lalo\Documents\DesarrolloWeb-BackEnd\curso-nodejs-postgres-main\node_modules\sequelize\lib\dialects\postgres\query.js:50:25)\n at C:\Users\Lalo\Documents\DesarrolloWeb-BackEnd\curso-nodejs-postgres-main\node_modules\sequelize\lib\sequelize.js:315:28\n at processTicksAndRejections (node:internal/process/task_queues:96:5)\n at async PostgresQueryInterface.insert (C:\Users\Lalo\Documents\DesarrolloWeb-BackEnd\curso-nodejs-postgres-main\node_modules\sequelize\lib\dialects\abstract\query-interface.js:308:21)\n at async Product.save (C:\Users\Lalo\Documents\DesarrolloWeb-BackEnd\curso-nodejs-postgres-main\node_modules\sequelize\lib\model.js:2490:35)\n at async Function.create (C:\Users\Lalo\Documents\DesarrolloWeb-BackEnd\curso-nodejs-postgres-main\node_modules\sequelize\lib\model.js:1362:12)\n at async ProductsService.create (C:\Users\Lalo\Documents\DesarrolloWeb-BackEnd\curso-nodejs-postgres-main\services\product.service.js:27:24)\n at async C:\Users\Lalo\Documents\DesarrolloWeb-BackEnd\curso-nodejs-postgres-main\routes\products.router.js:37:26"
}