node.js - mayor - Escribiendo Migraciones con Claves Extranjeras Usando SequelizeJS
sequelize mayor que (2)
¿Cómo puedo crear tablas con relaciones de clave externa entre sí a través de la Interfaz de consulta de Sequelize?
El método .createTable()
un diccionario de columnas. Puede ver la lista de atributos válidos en la documentación de .define()
, específicamente mirando las filas [attributes.column.*]
Dentro de la tabla params.
Para crear un atributo con una relación de clave externa, use los campos "referencias" y "referenciasClave":
Por ejemplo, lo siguiente crearía una tabla de users
y una tabla de user_emails
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 de ayuda se requieren para la secuela? Por ejemplo, parece que se esperan columnas específicas como createdAt o updatedAt.
Parece que un modelo estándar esperará una columna id
, updatedAt
y createdAt
para cada tabla.
queryInterface.createTable(''users'', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
createdAt: {
type: Sequelize.DATE
},
updatedAt: {
type: Sequelize.DATE
}
}
Si establece paranoid
en true
en su modelo, también necesita una deletedAt
tiempo deletedAt
.
El fondo
Estoy construyendo un proyecto con SequelizeJS , un ORM popular para NodeJS. Al diseñar un esquema, parece haber dos tácticas:
- Cree un código de modelo y use la función .sync () para generar automáticamente tablas para sus modelos.
- Cree un código de modelo y escriba migraciones manuales utilizando QueryInterface y umzug .
Mi entendimiento es que el # 1 es mejor para la creación rápida de prototipos, pero que el # 2 es una mejor práctica para los proyectos que se espera que evolucionen con el tiempo y donde los datos de producción necesitan poder sobrevivir a las migraciones.
Esta pregunta pertenece a la táctica # 2.
Las preguntas)
Mis tablas tienen relaciones que deben reflejarse a través de claves externas.
¿Cómo puedo crear tablas con relaciones de clave externa entre sí a través de la Interfaz de consulta de Sequelize?
¿Qué columnas y tablas auxiliares son requeridas por Sequelize? Por ejemplo, parece que se esperan columnas específicas como createdAt o updatedAt.
Quiero ofrecer otra 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, por lo que
migrations/create-project.js
migrations/create-projectType.js
porque el project
tenía la columna projectTypeId
hacía referencia a projectType
, que aún no se había creado debido al orden de los archivos y esto estaba causando un error.
Lo resolví agregando una restricción de clave externa después de crear ambas tablas. En mi caso, decidí escribirlo dentro de 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'',
}))