рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ
рдореИрдВ рдПрдирдо рдХреЙрд▓рдо рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдирдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ 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()
})
}
рдЗрд╕ рдкрд░ рдЯрдХреНрдХрд░, 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 рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ 9 рдореЗрдВ рдХреЛрдб _might_ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП