Knex: 移行内の列のnull許容制約を変更するにはどうすればよいですか?

作成日 2016年02月22日  ·  10コメント  ·  ソース: knex/knex

列の制約を変更しようとしていますが、これは列を再作成しようとしているように見え、失敗します。

exports.up = function(knex, Promise) {  
  return knex.schema.table("images", function(table) {
    table.string("checksum").notNullable();
  });
};

exports.down = function(knex, Promise) {
  return knex.schema.table("images", function(table) {
    table.string("checksum").nullable();
  });
};
PR please feature request schema

最も参考になるコメント

グーグルからここに来る人のために、構文は次のとおりです:

既存のNULL不可列をNULL可能に変換します(NULL不可をNULL可能にしたい場合は、上下を逆にします)。

exports.up = knex => {
  return knex.schema
    .alterTable('images', (table) => {
      table.string('checksum').nullable().alter();
    });
};

exports.down = knex => {
  return knex.schema
    .alterTable('images', table => {
      table.string('checksum').notNullable().alter();
    });
};

全てのコメント10件

@Rush .nullable().notNullable()がこれに使用されることを意図しているとは本当に思いません。 あなたは次のようなものを実行したいと思っているようです

ALTER TABLE tableName ALTER COLUMN columnName DROP NOT NULL
ALTER TABLE tableName ALTER COLUMN columnName SET NOT NULL

そして現在、これを処理できる.raw以外のAPIには何も見つかりません。

@ rhys-vdwこれについてどう思いますか? .dropNotNull() / .setNotNull()などはschemaBuilderに追加する価値がありますか? これは、 .dropForeign()の実装と非常によく似ています。

.dropNotNull()/。setNotNull()または同様のものは、schemaBuilderに追加する価値がありますか?

はい。ただし、おそらく.dropNullable(...columnNames)および.setNullable(...columnNames)

@ rhys-vdw考え直してみると、これはpostgres以外の方言にとってはあまりにも不便だと思います。 個人的に私は以下の良い解決策を見ていません:

Postgres dropNullable: ALTER TABLE table ALTER COLUMN columnName DROP NOT NULL
Postgres setNullable: ALTER TABLE table ALTER COLUMN columnName SET NOT NULL

MSSQL dropNullable: ALTER TABLE table ALTER COLUMN columnName columnType NULL
MSSQL setNullable: ALTER TABLE table ALTER COLUMN columnName columnType NOT NULL

MySQL/Maria/Oracle dropNullable: ALTER TABLE table MODIFY columnName columnType NULL;
MySQL/Maria/Oracle setNullable: ALTER TABLE table MODIFY columnName columnType NOT NULL;

Sqlite: No support?

実行している方言に基づいて、一貫性のない引数が生成されます。 Postgresは名前のみを必要とし、他の人は名前+データ型(+デフォルト値?)を必要とします。

あなたはどう思いますか、それは価値がありますか?

以前はSQLiteとPostgresの両方をサポートしていましたが、SQLiteは非常に異なっているため、抽象化しても隠すことはできません。そのような場合、例外をスローすることはおそらく正しいことです。 RailsのActiveRecord移行は制約の変更をサポートしているので、おそらくそれがインスピレーションを得る場所ですか?

結局、これは実装可能でした。 PRをしました。

+ 1-私もこの問題に遭遇したばかりで、それはブロッカーのようなものです。 null許容でない列の表現をマップする移行を行う必要があるときはいつでも、これが必要になります。

@morungosは、実際にはブロッカーではありません。knexの場合は特殊なAPI(移行を作成するときに多くのもの)がないものについては、いつでもknex.rawにドロップできます。

このプルリクエストが終了した場合、この問題を閉じることもできますhttps://github.com/tgriesser/knex/pull/1759

ええ、私は.rawを数回使用しましたが、それがステートメント全体に変わると、膝の移行の使用全体に疑問を呈し始めます。 結局、私は回避策を使用しました。デフォルトでnull以外の奇妙な値に設定し、マッピングルールを適用して値を更新してから、元の値を削除します。 ただし、特にMySQLを使用して整合性を強制している場合は、それを行うのが難しくなる可能性があり、中間ステップでも整合性を要求するという厄介な習慣があります。

グーグルからここに来る人のために、構文は次のとおりです:

既存のNULL不可列をNULL可能に変換します(NULL不可をNULL可能にしたい場合は、上下を逆にします)。

exports.up = knex => {
  return knex.schema
    .alterTable('images', (table) => {
      table.string('checksum').nullable().alter();
    });
};

exports.down = knex => {
  return knex.schema
    .alterTable('images', table => {
      table.string('checksum').notNullable().alter();
    });
};

参考までに、 nullablenonNullableに変更しようとしている場合は、最初にその列に何かを入力する必要があります。そうしないと、エラーが発生します。

グーグルからここに来る人のために、構文は次のとおりです:

既存のNULL不可列をNULL可能に変換します(NULL不可をNULL可能にしたい場合は、上下を逆にします)。

exports.up = knex => {
  return knex.schema
    .alterTable('images', (table) => {
      table.string('checksum').nullable().alter();
    });
};

exports.down = knex => {
  return knex.schema
    .alterTable('images', table => {
      table.string('checksum').notNullable().alter();
    });
};
このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

koskimas picture koskimas  ·  3コメント

npow picture npow  ·  3コメント

tjwebb picture tjwebb  ·  3コメント

legomind picture legomind  ·  3コメント

rarkins picture rarkins  ·  3コメント