Knex: knex移行を使用して外部キーを追加する前に、テーブルを作成する正しい方法はありますか?

作成日 2015年08月16日  ·  3コメント  ·  ソース: knex/knex

table2とtable3への参照を持つテーブルtable1があります。 外部キーを作成する前にtable2とtable3が作成されていることを確認する正しい方法は何ですか? 現在、すべてのテーブルに移行ファイルがありますが、テーブルの作成をチェーンする必要があると想定しています。

ありがとう

migrations question

最も参考になるコメント

あなたは正しいです。

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

全てのコメント3件

あなたは正しいです。

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

移行ファイルが特定の順序で実行されるようにする方法はありますか? たとえば、すべての「通常の」テーブルを1つのファイルに作成してから、別の移行ファイルを作成して、必要になる可能性のあるジャンクションテーブルを作成するのは悪い習慣ですか。

または、これをすべて同じファイルで実行する必要がありますか?

@LostCrossは、移行ファイルを単一のテーブルではなく、スキーマ全体への変更と

たとえば、最初の移行ファイルでショー全体を設定する必要があります。

アプリの存続期間中に新しい機能があり、それに伴ってデータベースに変更が加えられた場合、新しい移行ファイルが作成されます。

これが好きな場合は、テーブルをさまざまなファイルに分割するよりも問題がはるかに少なくなります。

各ファイルには1つのトランザクションがあるため、ファイルの実行を同期する場合は、シーケンスを当然のことと見なすために接続プールを混乱させる必要があります。 私は不可能ではありませんが、努力は報われません。

このページは役に立ちましたか?
0 / 5 - 0 評価