إنني أتطلع إلى كتابة سلسلة ترحيل لإضافة سلسلة جديدة إلى نوع عمود التعداد. أحاول إضافة 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
؟
تتم عمليات التعداد باستخدام قيود التحقق حاليًا ولا يوجد أي معاملة خاصة .alter()
لها ...
تتمثل إحدى المشكلات في أن .alter()
لا يعرف النوع الأصلي للعمود ولهذا السبب لا يعرف ما إذا كان يجب إسقاط قيد التحقق القديم الخاص بالتعداد.
بقدر ما أعرف حاليًا ، يمكن للمرء تغيير قيم التعداد المسموح بها فقط باستخدام knex.raw
بإسقاط القديم وإنشاء قيد شيك جديد ...
أعتقد أنه يمكن تنفيذه بواسطة بعض drop old constraint if exist
ثم إنشاء واحد جديد إذا كان النوع الذي تم تغييره من العمود هو التعداد.
أود أن أرى هذه الميزة قيد التنفيذ.
elhigu لقد كتبت استعلام تعداد مخصص حتى أتمكن من استخدام تعدادات Postgres ، ولكن هناك بعض الجدل في مجتمع Postgres حول شروط الاختيار مقابل الأرقام
فقط لمن يريد أن يعرف كيف يبدو الرمز _might_ في 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 شكرًا على مثال رمز الترحيل. فقط ما كنت أبحث عنه. أنا أواجه مشكلة واحدة رغم ذلك. يُظهر "myColumnName" خطأً عند الترحيل. تقول الرسالة "العمود 'mycolumnname' غير موجود". لاحظ أن حالة الجمل مفقودة الآن. أي أفكار حول كيفية الالتفاف على ذلك؟
@ 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'
])
);
};
إذا قمت بلف اسم العمود بعلامات اقتباس مزدوجة ، فإنني أحصل على خطأ في بناء الجملة لأن علامات الاقتباس المفردة لا تتم إزالتها في الكود الأولي.
أعتقد أنني قد أسقط الوظيفة وأكتب الكود الأولي مرتين.
@ Jordan24 بدون الاقتباس تطوي PostgreSQL جميع المعرفات إلى أحرف صغيرة.
تم ترميز كل شيء باستثناء "التعداد" للالتفاف حوله. شكرا لأجل الطرف @ kibertoad!
التعليق الأكثر فائدة
فقط لمن يريد أن يعرف كيف يبدو الرمز _might_ في Postgres 9