Knex: рдкреНрд░рд╢реНрди: рдХреНрдиреЗрдХреНрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЗрдВ рдПрдирдо рдХреЙрд▓рдо рдкреНрд░рдХрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рд╕рд┐рддре░ 2016  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: knex/knex

рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ

рдореИрдВ рдПрдирдо рдХреЙрд▓рдо рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдирдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ gamma рдХреЛ service рдХреЙрд▓рдо рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВрдиреЗ рдиреАрдЪреЗ рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдпрд╣ рдЯрдХрд░рд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рд╕реНрддрдВрдн рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред

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

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ 9 рдореЗрдВ рдХреЛрдб _might_ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП

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

рд╕рднреА 10 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕ рдкрд░ рдЯрдХреНрдХрд░, alter API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛?

рдПрдирдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪреЗрдХ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ .alter() рдЙрдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ ...

рдПрдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ .alter() рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреЙрд▓рдо рдХрд╛ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрд╕реЗ рдПрдирдо рдХреА рдкреБрд░рд╛рдиреА рдЪреЗрдХ рдмрд╛рдзрд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ knex.raw рдкреБрд░рд╛рдиреЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдФрд░ рдирдИ рдЪреЗрдХ рдмрд╛рдзрд╛ рдмрдирд╛рдХрд░ рдЕрдиреБрдордд рдПрдирдо рдорд╛рдиреЛрдВ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреБрдЫ drop old constraint if exist рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдХреЙрд▓рдо рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдкреНрд░рдХрд╛рд░ enum рд╣реЛрдиреЗ рдкрд░ рдирдпрд╛ рдмрдирд╛рдПрдВред

рдореБрдЭреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

@elhigu рдореИрдВрдиреЗ рдПрдХ рдХрд╕реНрдЯрдо рддрд╛рдХрд┐ рдореИрдВ

рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ 9 рдореЗрдВ рдХреЛрдб _might_ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП

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

@ рд╣реЛрд▓реЛрд╡реЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЗрд╕рдХреА рд╣реА рдЦреЛрдЬ рдереАред рдореИрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдБред рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рддреЗ рд╕рдордп 'myColumnName' рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗ рд░рд╣рд╛ рд╣реИред рд╕рдВрджреЗрд╢ рдХрд╣рддрд╛ рд╣реИ "рдХреЙрд▓рдо 'mycolumnname' рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ"ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреИрдорд▓рдХреЗрд╕ рдЕрдм рдЧрд╛рдпрдм рд╣реИред рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреИрд╕реЗ рдЬрд╛рдирд╛ рд╣реИ рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

@ рдЬреЙрд░реНрдбрди 24 рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

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

рдЕрдЧрд░ рдореИрдВ рдХреЙрд▓рдордирд╛рдо рдХреЛ рдбрдмрд▓ рдХреЛрдЯреНрд╕ рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдЪреНрдЪреЗ рдХреЛрдб рдореЗрдВ рд╕рд┐рдВрдЧрд▓ рдХреЛрдЯреНрд╕ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдХреЗрд╡рд▓ рджреЛ рдмрд╛рд░ рдХрдЪреНрдЪрд╛ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВред

@ рдЬреЙрд░реНрдбрди реирек рдмрд┐рдирд╛ рдЙрджреНрдзрд░рдгреЛрдВ рдХреЗ PostgreSQL рд╕рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓реЛрдЕрд░рдХреЗрд╕ рдореЗрдВ рдореЛрдбрд╝ рджреЗрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП 'рдПрдирдо' рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдХреЛ рд╣рд╛рд░реНрдб рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЯрд┐рдк @kibertoad рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕