Knex: Como alterar a restrição anulável na coluna dentro de uma migração?

Criado em 22 fev. 2016  ·  10Comentários  ·  Fonte: knex/knex

Estou tentando alterar uma restrição em uma coluna, mas isso parece apenas para tentar recriar a coluna e falha.

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

Comentários muito úteis

Para aqueles que vêm do google, a sintaxe é:

Converter uma coluna não anulável existente para ser anulável (reverter o up / down se quiser que um não anulável seja anulável).

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

Todos 10 comentários

@Rush Eu realmente não acho que .nullable() e .notNullable() devem ser usados ​​para isso. Parece-me que você está querendo fazer algo como

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

E atualmente não consigo encontrar nada na API além de .raw que possa lidar com isso.

@ rhys-vdw Qual é a sua opinião sobre isso? Poderia .dropNotNull() / .setNotNull() ou similar ser uma adição válida ao schemaBuilder? Seria muito semelhante à implementação de .dropForeign() .

Poderia .dropNotNull () /. SetNotNull () ou similar ser uma adição válida ao schemaBuilder?

Sim, mas provavelmente como .dropNullable(...columnNames) e .setNullable(...columnNames) .

@ rhys-vdw Pensando bem, acho que isso será um inconveniente demais para qualquer dialeto que não seja o postgres. Pessoalmente, não vejo uma boa solução para o seguinte:

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?

Isso resultaria em argumentos inconsistentes com base no dialeto que você está executando. Postgres quer apenas nome, enquanto outros querem nome + tipo de dados (+ valor padrão?).

O que você acha, vale a pena?

Costumávamos oferecer suporte a SQLite e Postgres, mas o SQLite é tão diferente que nenhuma abstração pode escondê-lo ... então lançar uma exceção é provavelmente a coisa certa nesses casos. As migrações do ActiveRecord do Rails suportam a alteração de restrições, então talvez seja esse o lugar para se inspirar?

Afinal, isso era possível implementar. Eu fiz um PR.

1 - Eu também acabei de encontrar esse problema, e é uma espécie de bloqueador. Sempre que você precisar fazer uma migração que mapeie representações para colunas não anuláveis, você precisará disso.

@morungos não é realmente um bloqueador, já que você sempre pode ir para knex.raw para coisas que para knex não têm APIs especializadas (muitas coisas ao escrever migrações).

Se esta solicitação de pull for concluída, este problema também pode ser fechado https://github.com/tgriesser/knex/pull/1759

Sim, usei .raw algumas vezes, mas se se transforma em declarações inteiras, começa a questionar todo o uso de migrações de joelho. No final, usei uma solução alternativa: apenas usar como padrão algum valor estranho não nulo, aplicar as regras de mapeamento para atualizar os valores e, em seguida, eliminar o original. Mas pode ficar difícil fazer isso se você estiver impondo integridade, especialmente com MySQL, e é o péssimo hábito de exigir integridade mesmo durante as etapas intermediárias.

Para aqueles que vêm do google, a sintaxe é:

Converter uma coluna não anulável existente para ser anulável (reverter o up / down se quiser que um não anulável seja anulável).

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

Apenas para sua informação, caso você esteja tentando alterar nullable para nonNullable primeiro você precisa preencher essa coluna com algo, caso contrário, receberá um erro.

Para aqueles que vêm do google, a sintaxe é:

Converter uma coluna não anulável existente para ser anulável (reverter o up / down se quiser que um não anulável seja anulável).

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();
    });
};
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

tjwebb picture tjwebb  ·  3Comentários

lanceschi picture lanceschi  ·  3Comentários

ghost picture ghost  ·  3Comentários

arconus picture arconus  ·  3Comentários

koskimas picture koskimas  ·  3Comentários