Knex: سؤال: تحديث أنواع أعمدة التعداد في ترحيل knex

تم إنشاؤها على ٢٧ سبتمبر ٢٠١٦  ·  10تعليقات  ·  مصدر: knex/knex

Stackoverflow

إنني أتطلع إلى كتابة سلسلة ترحيل لإضافة سلسلة جديدة إلى نوع عمود التعداد. أحاول إضافة 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()
  })
}
PR please

التعليق الأكثر فائدة

فقط لمن يريد أن يعرف كيف يبدو الرمز _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',
    ])
  );
};

ال 10 كومينتر

ارتطام بهذا ، هل من طريقة لاستخدام واجهة برمجة تطبيقات 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!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات