Tengo una tabla, table1, que tiene una referencia a table2 y table3. ¿Cuál es la forma correcta de garantizar que table2 y table3 se creen antes de crear las claves externas? Actualmente tengo un archivo de migración para cada tabla, pero supongo que tengo que encadenar la creación de las tablas.
Gracias
Estás en lo correcto.
// migration: <timestamp>_create_things.js
module.exports.up = function(knex, Promise) {
// Create referenced table before referencing table.
return knex.schema
.createTable('first', function(first) {
first.increments('id').primary();
})
.createTable('second', function(second) {
second.increments('id').primary();
second.integer('first_id').references('id').inTable('first').notNull().onDelete('cascade');
});
};
module.exports.down = function(knex, Promise) {
// Reverse order here to prevent error.
return knex.schema
.dropTable('second')
.dropTable('first');
}
¿Existe alguna forma de garantizar que los archivos de migración se ejecuten en un orden determinado? Por ejemplo, ¿es una mala práctica crear todas mis tablas "normales" en un archivo y luego tener otro archivo de migración para crear las tablas de unión que pueda necesitar?
¿O debería hacerse todo esto en el mismo archivo?
@LostCross piensa en los archivos de migración como modificaciones a todo el esquema, no a una sola tabla.
por ejemplo, el primer archivo de migración debe configurar todo el programa.
Si durante la vida de la aplicación hay una nueva característica y con ella algunos cambios en la base de datos, se creará un nuevo archivo de migración.
si lo hace así, tendrá muchos menos problemas que dividir sus tablas en varios archivos.
Cada archivo tiene una transacción, por lo que si desea sincronizar la ejecución de sus archivos, deberá alterar su grupo de conexiones para dar por sentada la secuencia. No es imposible, pero el esfuerzo no vale la pena.
Comentario más útil
Estás en lo correcto.