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.