Knex: Maneira correta de criar tabelas antes de tentar adicionar chaves estrangeiras usando a migração do knex?

Criado em 16 ago. 2015  ·  3Comentários  ·  Fonte: knex/knex

Eu tenho uma tabela, tabela1, que tem uma referência para tabela2 e tabela3. Qual é a maneira correta de garantir que table2 e table3 sejam criadas antes de criar as chaves estrangeiras? Atualmente, tenho um arquivo de migração para cada tabela, mas estou assumindo que preciso encadear a criação das tabelas.

obrigado

migrations question

Comentários muito úteis

Você está correto.

// 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');
}

Todos 3 comentários

Você está correto.

// 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 uma maneira de garantir que os arquivos de migração sejam executados em uma determinada ordem? Por exemplo, é uma prática ruim criar todas as minhas tabelas "regulares" em um arquivo e, em seguida, ter outro arquivo de migração para criar quaisquer tabelas de junção de que possa precisar?

Ou tudo isso deve ser feito no mesmo arquivo?

@LostCross pensa nos arquivos de migração como modificações em todo o esquema, não em uma única tabela.

por exemplo, o primeiro arquivo de migração deve definir o show inteiro.

se durante a vida do aplicativo houver um novo recurso e com ele algumas alterações no banco de dados, um novo arquivo de migração deve ser criado.

se você fizer assim, terá muito menos problemas do que dividir suas tabelas em vários arquivos.

Cada arquivo tem uma transação, então se você quiser sincronizar a execução de seus arquivos, você precisará mexer com seu pool de conexão para que a sequência seja garantida. Não é impossível, mas o esforço não compensa.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

npow picture npow  ·  3Comentários

sandrocsimas picture sandrocsimas  ·  3Comentários

saurabhghewari picture saurabhghewari  ·  3Comentários

lanceschi picture lanceschi  ·  3Comentários

koskimas picture koskimas  ·  3Comentários