Para generar el archivo add-role.js hay que correr el comando
npm run migrations:generate add-role
Introducción
Persistencia de datos en Node.js
Platzi Store: instalación y presentación del proyecto
Base de datos
Instalación de Docker
Configuración de Postgres en Docker
Explorando Postgres: interfaces gráficas vs. terminal
Integración de node-postgres
Manejando un Pool de conexiones
Variables de ambiente en Node.js
Sequelize
¿Qué es un ORM? Instalación y configuración de Sequelize ORM
Tu primer modelo en Sequelize
Crear, actualizar y eliminar
Cambiando la base de datos a MySQL
Migraciones
¿Qué son las migraciones? Migraciones en Sequelize ORM
Configurando y corriendo migraciones con npm scripts
Modificando una entidad
Relaciones
Relaciones uno a uno
Resolviendo las relaciones uno a uno
Relaciones uno a muchos
Resolviendo relaciones uno a muchos
Consultas
Órdenes de compra
Relaciones muchos a muchos
Resolviendo relaciones muchos a muchos
Paginación
Filtrando precios con operadores
Despliegue
Deploy en Heroku
Consideraciones al hacer migraciones
Próximos pasos
Toma con el Curso de Backend con Node.js: Autenticación con Passport.js y JWT
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Aportes 18
Preguntas 18
Para generar el archivo add-role.js hay que correr el comando
npm run migrations:generate add-role
Con sequelize.sync()
no se puede alterar una tabla que ya está creada ya que únicamente lee el modelo, y en caso de hacer alguna modificación, se queda con la primera versión (no se puede agregar un atributo más). Con las migraciones es más flexible ya que sí se pueden hacer modificaciones y tener todo de una forma organizada.
Para agregar una columna se hace con el método addColumn
, se define el nombre de la tabla, seguido del nombre de la columna, finalmente el esquema (nulo, string, etc), en ese caso se define el esquema del campo en específico.
await queryInterface.addColumn(USER_TABLE, 'role', UserSchema.
Para quitar la columna se usa el método removeColumn
definiendo el nombre de la tabla y de la columna.
await queryInterface.removeColumn(USER_TABLE, 'role');
Se debe correr la migración para ejecutar los cambios, esta va a correr a partir de la última migración.
Éxito rotundo
Hay un salto de edición, no se ve el proceso para crear la nueva migración add-role para crearlo tenemos que hacer uso de nuestro script :
npm run migrations:generate add-role
ℹ️ Repositorio: Link
.
✨
user.js
. Definición de esquema
import { DataTypes, Sequelize as SequelizeClient } from 'sequelize';
/**
* @description description of each field in the table
* @typedef {Object} field definition
* @property {boolean} allowNull - false=NOT NULL
* @property {boolean} autoIncrement - each insert, increase the counter
* @property {boolean} primaryKey - define is primary key
* @property {boolean} type - expresion to match SQL type
* @property {boolean} unique - difne as unique the field
* @property {boolean} field - rename the field
*/
export default {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: DataTypes.INTEGER,
},
email: {
allowNull: false,
type: DataTypes.STRING,
unique: true,
},
password: {
allowNull: false,
type: DataTypes.STRING,
},
createdAt: {
allowNull: false,
type: DataTypes.DATE,
field: 'created_at',
defaultValue: SequelizeClient.NOW,
},
updatedAt: {
allowNull: false,
type: DataTypes.DATE,
field: 'updated_at',
defaultValue: SequelizeClient.NOW,
},
};
.
✨
config.js
. Configuración de entornos
import Sequelize from './../libs/sequelize';
module.exports = Sequelize.migration;
.
♻️
.sequelizerc
Configuración delsequelize
require('@babel/register');
module.exports = {
config: './src/mocks/config.js',
'migrations-path': './src/mocks/migrations',
'seeders-path': './src/mocks/seeders',
};
♻️
package.json
. Adición de scrips de generación y ejecución
"seeds:generate": "sequelize-cli seed:generate --name",
"seeds:run": "sequelize-cli db:seed:all",
"migrations:generate": "sequelize-cli migration:generate --name",
"migrations:run": "sequelize-cli db:migrate",
"db:generate": "npm run migrations:run && npm run seeds:run",
.
migration
y seeds
✨
create-user-table.js
import userSchema from '../models/user';
module.exports = {
up: async (queryInterface) => {
await queryInterface.createTable('users', userSchema);
},
down: async (queryInterface) => {
await queryInterface.drop('users');
},
};
✨
users.js
.
💡Para la generación de Seeds, puede ocupar un generador de mocks como Mockaroo
module.exports = {
up: (queryInterface) => {
return queryInterface.bulkInsert('users', [
{
email: '[email protected]',
password: 'dIkttoW58AZl',
created_at: new Date(),
updated_at: new Date(),
},
{
email: '[email protected]',
password: 'LWGHo4Sf',
created_at: new Date(),
updated_at: new Date(),
},
{
email: '[email protected]',
password: '8iKZ14bBA',
created_at: new Date(),
updated_at: new Date(),
},
{
email: '[email protected]',
password: 'GLY4O1',
created_at: new Date(),
updated_at: new Date(),
},
{
email: '[email protected]',
password: 'dWYttZ4',
created_at: new Date(),
updated_at: new Date(),
},
]);
},
down: (queryInterface) => {
return queryInterface.bulkDelete('users', null, {});
},
};
Una cosa importante es que cuando corremos una migración, queda un registro de esa migración en base de datos de dicha migración. Por ejemplo, recientemente corrimos el comando de creación de la tabla users, entonces en la base de datos se creará una carpeta llamada SequelizeMeta, en donde quedará un registro de que se corrió dicha migración.
Por lo que si corremos ahora esta última migración de agregar una columna, Sequelize consultará en base de datos en el registro de migraciones cual fue la última migración que hizo en dicha carpeta, por lo que no volverá a correr una migración que ya quedo registrada, sino de todas de las que no tiene registro en base de datos. Es decir, una vez que corremos una migración, debemos crear otra migración si queremos realizar alguna otra operación, exceptuando que no sea ir para atrás de la última migración que hicimos
Muy bien ya me quedo
Excelente clase muy buena info.
ahora si todo bien funciono aunque tuve que corregir algunos temas pero funcion… 😄
[
{
"id": 1,
"email": "[email protected]",
"password": "12345678",
"role": "customer",
"createdAt": "2021-11-25T11:03:34.941Z"
},
{
"id": 2,
"email": "[email protected]",
"password": "12345678",
"role": "customer",
"createdAt": "2021-11-25T11:03:48.567Z"
}
]
Si definen los modelos de esta manera 👇🏽
const { DataTypes, Sequelize } = require("sequelize");
const { sequelize } = require("../db");
const User = sequelize.define("user", {
id: {
allowNull: false,
primaryKey: true,
type: DataTypes.STRING,
},
email: {
allowNull: false,
type: DataTypes.STRING,
unique: true,
},
password: {
allowNull: false,
type: DataTypes.STRING,
},
role: {
allowNull: false,
type: DataTypes.STRING,
defaultValue: "customer",
},
createdAt: {
allowNull: false,
type: DataTypes.DATE,
field: "create_at",
defaultValue: Sequelize.NOW,
},
});
module.exports = User;
Entonces deben escribir la migracion de esta manera 👇🏽
"use strict";
const User = require("../models/user.model");
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface) => {
await queryInterface.createTable(User.getTableName(), User.getAttributes());
},
down: async (queryInterface) => {
await queryInterface.dropTable(User.getTableName());
},
};
npm run migrations:generate add-role
excelente curso, hecho en pequeñas capsulas para ir directamente al video, justo necesitaba este video para aplicarlo en mis proyectos
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?