Knex: ์งˆ๋ฌธ: knex ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์—์„œ ์—ด๊ฑฐํ˜• ์—ด ์œ ํ˜• ์—…๋ฐ์ดํŠธ

์— ๋งŒ๋“  2016๋…„ 09์›” 27์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: knex/knex

์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ

์—ด๊ฑฐํ˜• ์—ด ์œ ํ˜•์— ์ƒˆ ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฌธ์ž์—ด์„ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. service ์—ด์— gamma ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋กœ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”๊ณผ ์—ด์ด ์ด๋ฏธ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

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

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

Postgres 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() ๊ฐ€ ์—ด์˜ ์›๋ž˜ ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— enum์˜ ์ด์ „ ๊ฒ€์‚ฌ ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ํ˜„์žฌ ํ—ˆ์šฉ๋œ ์—ด๊ฑฐํ˜• ๊ฐ’์€ knex.raw ๋กœ๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ drop old constraint if exist ๋กœ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ ์—ด์˜ ๋ณ€๊ฒฝ๋œ ์œ ํ˜•์ด ์—ด๊ฑฐํ˜•์ธ ๊ฒฝ์šฐ ์ƒˆ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@elhigu Postgres ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ์ž ์ง€์ • ์—ด๊ฑฐํ˜• ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ํ™•์ธ ์กฐ๊ฑด ๋Œ€ ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด Postgres ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์•ฝ๊ฐ„์˜ ๋…ผ์Ÿ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

@holloway ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ฝ”๋“œ ์˜ˆ์ œ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ๋˜ ๋ฐ”๋กœ ๊ทธ ๊ฒƒ. ํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ 'myColumnName'์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. "'mycolumnname' ์—ด์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด์ œ camelCase๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@Jordan24 ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

columnName์„ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์œผ๋ฉด ์ž‘์€๋”ฐ์˜ดํ‘œ๊ฐ€ ์›์‹œ ์ฝ”๋“œ์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
ํ•จ์ˆ˜๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์›์‹œ ์ฝ”๋“œ๋ฅผ ๋‘ ๋ฒˆ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@Jordan24 ๋”ฐ์˜ดํ‘œ ์—†์ด PostgreSQL์€ ๋ชจ๋“  ์‹๋ณ„์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ์ ‘์Šต๋‹ˆ๋‹ค.

'์—ด๊ฑฐํ˜•'์„ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ํ•˜๋“œ ์ฝ”๋”ฉํ–ˆ์Šต๋‹ˆ๋‹ค. @kibertoad ํŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰