Saltar al contenido

Escribiendo Migraciones con Claves Foráneas Usando SequelizeJS

Hacemos una verificación exhaustiva cada reseñas de nuestro sitio web con la meta de mostrarte en todo momento la información más veraz y actual.

Solución:

¿Cómo creo tablas con extranjeros? key relaciones entre sí a través de Sequelize QueryInterface?

El .createTable() El método toma un diccionario de columnas. Puedes ver la lista de válidos attributes en la documentación para .define(), específicamente mirando el [attributes.column.*] filas dentro de la tabla de parámetros.

Para crear un attribute con un extranjero key relación, use los campos “references” y “referencesKey”:

Por ejemplo, lo siguiente crearía un users mesa, y un user_emails tabla que hace referencia a la tabla de usuarios.

queryInterface.createTable('users', 
  id: 
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  
).then(function() 
  queryInterface.createTable('user_emails', 
    userId: 
      type: Sequelize.INTEGER,
      references:  model: 'users', key: 'id' 
    
  )
);

¿Qué columnas y tablas auxiliares requiere la secuenciación? Por ejemplo, parece que se esperan columnas específicas como createdAt o updatedAt.

Parece que un modelo estándar esperará una id, updatedAt, y createdAt columna de cada tabla.

queryInterface.createTable('users', 
  id: 
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  ,
  createdAt: 
    type: Sequelize.DATE
  ,
  updatedAt: 
    type: Sequelize.DATE
  

si configuras paranoid a true en su modelo, también necesita un deletedAt marca de tiempo

Quiero ofrecer otro alternativa más manual porque al usar migraciones manuales y queryInterface me encontré con el siguiente problema: tenía 2 archivos en la carpeta de migración así

migrations/create-project.js
migrations/create-projectType.js

porque project tenía columna projectTypeId hizo referencia projectType, que aún no se creó debido al orden de los archivos y esto estaba causando un error.

Lo resolví agregando un extranjero key restricción después de crear ambas tablas. En mi caso decidí escribirlo dentro create-projectType.js:

queryInterface.createTable('project_type', 
  // table attributes ...
)
.then(() => queryInterface.addConstraint('project', ['projectTypeId'], 
  type: 'FOREIGN KEY',
  name: 'FK_projectType_project', // useful if using queryInterface.removeConstraint
  references: 
    table: 'project_type',
    field: 'id',
  ,
  onDelete: 'no action',
  onUpdate: 'no action',
))

Esto es para crear un archivo de migración para agregar una columna.

Aquí quiero agregar una columna area_id en usuarios mesa. Ejecutar comando:

sequelize migration:create --name add-area_id-in-users

Una vez que se ejecuta crea un archivo de migración timestamp-add-region_id-in-users en la carpeta de migraciones.

En el archivo de migración creado, pegue el siguiente código:

'use strict';

module.exports = 
  up: (queryInterface, Sequelize) => 
        return Promise.all([
          queryInterface.addColumn('users', 'region_id',
            
              type: Sequelize.UUID,
              references: 
                model: 'regions',
                key: 'id',
              ,
              onUpdate: 'CASCADE',
              onDelete: 'SET NULL',
              defaultValue: null, after: 'can_maintain_system'
            ),
        ]);
      ,

      down: (queryInterface, Sequelize) => 
        return Promise.all([
          queryInterface.removeColumn('users', 'region_id'),
        ]);
      
    ;

Aquí, en la tabla de usuarios, voy a crear una columna denominada region_id junto con el tipo y la relación/extranjero key/referencias. Eso es.

Si estás de acuerdo, tienes la opción de dejar un escrito acerca de qué te ha parecido este artículo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *