Knex: Pertanyaan: Perbarui jenis kolom enum dalam migrasi knex

Dibuat pada 27 Sep 2016  ·  10Komentar  ·  Sumber: knex/knex

Stackoverflow

Saya ingin menulis string migrasi untuk menambahkan string baru ke tipe kolom enum. Saya mencoba menambahkan gamma ke kolom service .

Saya mencoba dengan kode ini di bawah ini. Ini bertabrakan karena tabel dan kolom sudah ada.

const table = 'user_associations'

export function up (knex, Promise) {
  return knex.schema.table(table, function (table) {
    table.enu('service', ['alpha', 'beta', 'gamma']).notNullable()
  })
}

export function down (knex, Promise) {
  return knex.schema.table(table, function (table) {
    table.enu('service', ['alpha', 'beta']).notNullable()
  })
}
PR please

Komentar yang paling membantu

Hanya untuk siapa saja yang ingin tahu bagaimana kode _might_ terlihat di Postgres 9

const formatAlterTableEnumSql = (
  tableName,
  columnName,
  enums,
) => {
  const constraintName = `${tableName}_${columnName}_check`;
  return [
    `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS ${constraintName};`,
    `ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} CHECK (${columnName} = ANY (ARRAY['${enums.join(
      "'::text, '"
    )}'::text]));`,
  ].join('\n');
};


exports.up = async function up(knex) {
  await knex.raw(
    formatAlterTableEnumSql('myTableName', 'myColumnName', [
      'enum1',
      'enum2',
      'enum3',
    ])
  );
};

exports.down = async function down(knex) {
  await knex.raw(
    formatAlterTableEnumSql('myTableName', 'myColumnName', [
      'enum1',
      'enum2',
    ])
  );
};

Semua 10 komentar

Bump ini, ada cara untuk menggunakan alter API?

enums selesai dengan batasan pemeriksaan saat ini dan .alter() tidak memiliki perlakuan khusus untuk mereka ...

Satu masalah adalah .alter() tidak tahu apa tipe asli kolom dan itulah mengapa ia tidak tahu apakah itu harus menghilangkan batasan cek lama enum.

Sejauh yang saya tahu saat ini seseorang dapat mengubah nilai enum yang diizinkan hanya dengan knex.raw dengan menghapus yang lama dan membuat batasan centang baru ...

Saya pikir itu bisa diimplementasikan oleh beberapa drop old constraint if exist dan kemudian buat yang baru jika jenis kolom yang diubah adalah enum.

Saya akan senang melihat fitur ini diimplementasikan.

@elhigu Saya menulis kueri enum khusus sehingga saya dapat menggunakan enum Postgres, namun ada beberapa perdebatan di komunitas Postgres tentang kondisi pemeriksaan vs enum

Hanya untuk siapa saja yang ingin tahu bagaimana kode _might_ terlihat di Postgres 9

const formatAlterTableEnumSql = (
  tableName,
  columnName,
  enums,
) => {
  const constraintName = `${tableName}_${columnName}_check`;
  return [
    `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS ${constraintName};`,
    `ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} CHECK (${columnName} = ANY (ARRAY['${enums.join(
      "'::text, '"
    )}'::text]));`,
  ].join('\n');
};


exports.up = async function up(knex) {
  await knex.raw(
    formatAlterTableEnumSql('myTableName', 'myColumnName', [
      'enum1',
      'enum2',
      'enum3',
    ])
  );
};

exports.down = async function down(knex) {
  await knex.raw(
    formatAlterTableEnumSql('myTableName', 'myColumnName', [
      'enum1',
      'enum2',
    ])
  );
};

@holloway Terima kasih untuk contoh kode migrasi. Hanya apa yang saya cari. Aku mengalami satu masalah sekalipun. 'myColumnName' membuat kesalahan saat bermigrasi. Pesan mengatakan "kolom 'mycolumnname' tidak ada". Perhatikan camelCase sekarang hilang. Ada ide tentang cara menyiasatinya?

@Jordan24 Bisakah Anda membagikan kode Anda?

'use strict';

const formatAlterTableEnumSql = (tableName, columnName, enums) => {

  const constraintName = `${tableName}_${columnName}_check`;
  return [
    `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS ${constraintName};`,
    `ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} CHECK (${columnName} = ANY (ARRAY['${enums.join(
      `'::text, '`
    )}'::text]));`
  ].join('\n');
};


exports.up = async function up(knex) {

  await knex.raw(
    formatAlterTableEnumSql('item_messages', 'sentMethod', [
      'Web App', 'Email', 'Text Message', 'Log Conversation'
    ])
  );
};

exports.down = async function down(knex) {

  await knex.raw(
    formatAlterTableEnumSql('item_messages', 'sentMethod', [
      'Web App', 'Email', 'Text Message'
    ])
  );
};

Jika saya membungkus nama kolom dalam tanda kutip ganda, saya mendapatkan kesalahan sintaks karena tanda kutip tunggal tidak dihapus dalam kode mentah.
Saya pikir saya mungkin menjatuhkan fungsinya dan hanya menulis kode mentah dua kali.

@Jordan24 Tanpa tanda kutip PostgreSQL melipat semua pengenal menjadi huruf kecil.

Semua kode keras kecuali 'enum' untuk menyiasatinya. Terima kasih atas tipnya @kibertoad!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat