Knex: Bagaimana cara mengubah batasan yang dapat dibatalkan di kolom di dalam migrasi?

Dibuat pada 22 Feb 2016  ·  10Komentar  ·  Sumber: knex/knex

Saya mencoba mengubah batasan pada kolom tetapi ini sepertinya mencoba membuat ulang kolom dan gagal.

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

Komentar yang paling membantu

Bagi Anda yang datang ke sini dari google, sintaksnya adalah:

Mengonversi kolom nonNullable yang ada menjadi nullable (balikkan ke atas/bawah jika Anda ingin nonNullable menjadi nullable).

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();
    });
};

Semua 10 komentar

@Rush Saya benar-benar tidak berpikir .nullable() dan .notNullable() dimaksudkan untuk digunakan untuk ini. Sepertinya saya Anda ingin menjalankan sesuatu seperti

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

Dan saat ini saya tidak dapat menemukan apa pun di API selain .raw yang dapat menangani ini.

@rhys-vdw Apa pendapat Anda tentang ini? Bisakah .dropNotNull() / .setNotNull() atau serupa menjadi tambahan yang layak untuk schemaBuilder? Ini akan sangat mirip dengan implementasi .dropForeign() .

Bisakah .dropNotNull()/.setNotNull() atau serupa menjadi tambahan yang layak untuk schemaBuilder?

Ya, tapi mungkin sebagai .dropNullable(...columnNames) dan .setNullable(...columnNames) .

@rhys-vdw Setelah dipikir-pikir, saya merasa ini akan terlalu merepotkan untuk dialek apa pun selain postgres. Secara pribadi saya tidak melihat solusi yang baik untuk yang berikut:

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?

Ini akan menghasilkan argumen yang tidak konsisten berdasarkan dialek yang Anda gunakan. Postgres hanya menginginkan nama, sementara yang lain menginginkan nama + tipe data (+ nilai default?).

Bagaimana menurut Anda, apakah itu layak?

Kami dulu mendukung SQLite dan Postgres tetapi SQLite sangat berbeda sehingga tidak ada jumlah abstraksi yang dapat menyembunyikannya ... jadi melempar pengecualian mungkin adalah hal yang benar dalam kasus seperti itu. Migrasi ActiveRecord Rails mendukung perubahan batasan jadi mungkin itu tempat untuk mengambil inspirasi?

Bagaimanapun, ini mungkin untuk diterapkan. Saya sudah membuat PR.

+1 -- Saya baru saja menemukan masalah ini juga, dan ini semacam pemblokir. Setiap kali Anda perlu melakukan migrasi yang memetakan representasi untuk kolom yang tidak dapat dibatalkan, Anda akan memerlukan ini.

@morungos sebenarnya bukan pemblokir, karena Anda selalu dapat membuka knex.raw untuk hal-hal yang untuk knex tidak memiliki API khusus (banyak hal saat menulis migrasi).

Jika permintaan tarik ini selesai, masalah ini juga dapat ditutup https://github.com/tgriesser/knex/pull/1759

Ya, saya telah menggunakan .raw beberapa kali, tetapi jika itu berubah menjadi seluruh pernyataan, itu mulai mempertanyakan seluruh penggunaan migrasi lutut. Pada akhirnya, saya memang menggunakan solusi: default saja ke beberapa nilai aneh non-null, lalu terapkan aturan pemetaan untuk memperbarui nilai, lalu jatuhkan yang asli. Tetapi akan sulit untuk melakukannya jika Anda menerapkan integritas, terutama dengan MySQL dan kebiasaan buruk membutuhkan integritas bahkan selama langkah-langkah perantara.

Bagi Anda yang datang ke sini dari google, sintaksnya adalah:

Mengonversi kolom nonNullable yang ada menjadi nullable (balikkan ke atas/bawah jika Anda ingin nonNullable menjadi nullable).

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();
    });
};

Sekadar informasi, jika Anda mencoba mengubah nullable menjadi nonNullable Anda harus mengisi kolom itu terlebih dahulu dengan sesuatu, jika tidak, Anda akan mendapatkan kesalahan.

Bagi Anda yang datang ke sini dari google, sintaksnya adalah:

Mengonversi kolom nonNullable yang ada menjadi nullable (balikkan ke atas/bawah jika Anda ingin nonNullable menjadi nullable).

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();
    });
};
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

hyperh picture hyperh  ·  3Komentar

saurabhghewari picture saurabhghewari  ·  3Komentar

mattgrande picture mattgrande  ·  3Komentar

fsebbah picture fsebbah  ·  3Komentar

lanceschi picture lanceschi  ·  3Komentar