Knex: كيفية تغيير القيد nullable في العمود داخل الهجرة؟

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

أحاول تغيير أحد القيود في عمود ولكن يبدو أن هذا يحاول إعادة إنشاء العمود ويفشل.

exports.up = function(knex, Promise) {  
  return knex.schema.table("images", function(table) {
    table.string("checksum").notNullable();
  });
};

exports.down = function(knex, Promise) {
  return knex.schema.table("images", function(table) {
    table.string("checksum").nullable();
  });
};
PR please feature request schema

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

بالنسبة لأولئك الذين يأتون إلى هنا من Google ، فإن التركيب هو:

تحويل عمود موجود غير قابل للصفاء ليكون nullable (قم بعكس أعلى / أسفل إذا كنت تريد أن يكون nonNullable لاغياً).

exports.up = knex => {
  return knex.schema
    .alterTable('images', (table) => {
      table.string('checksum').nullable().alter();
    });
};

exports.down = knex => {
  return knex.schema
    .alterTable('images', table => {
      table.string('checksum').notNullable().alter();
    });
};

ال 10 كومينتر

Rush لا أعتقد حقًا أنه من المفترض استخدام .nullable() و .notNullable() لهذا الغرض. يبدو لي أنك تريد تشغيل شيء مثل

ALTER TABLE tableName ALTER COLUMN columnName DROP NOT NULL
ALTER TABLE tableName ALTER COLUMN columnName SET NOT NULL

وحاليًا لا يمكنني العثور على أي شيء في واجهة برمجة التطبيقات بخلاف .raw يمكنه التعامل مع هذا الأمر.

@ rhys-vdw ما رأيك في هذا؟ هل يمكن أن يكون .dropNotNull() / .setNotNull() أو ما شابه ذلك إضافة قيمة إلى schemaBuilder؟ سيكون مشابهًا جدًا لتطبيق .dropForeign() .

هل يمكن أن يكون .dropNotNull () /. setNotNull () أو ما شابه ذلك إضافة جديرة بالاهتمام إلى schemaBuilder؟

نعم ، ولكن على الأرجح .dropNullable(...columnNames) و .setNullable(...columnNames) .

@ rhys-vdw في التفكير الثاني ، أشعر أن هذا سيكون كثيرًا من الإزعاج لأي لهجة بخلاف postgres. أنا شخصياً لا أرى حلاً جيدًا لما يلي:

Postgres dropNullable: ALTER TABLE table ALTER COLUMN columnName DROP NOT NULL
Postgres setNullable: ALTER TABLE table ALTER COLUMN columnName SET NOT NULL

MSSQL dropNullable: ALTER TABLE table ALTER COLUMN columnName columnType NULL
MSSQL setNullable: ALTER TABLE table ALTER COLUMN columnName columnType NOT NULL

MySQL/Maria/Oracle dropNullable: ALTER TABLE table MODIFY columnName columnType NULL;
MySQL/Maria/Oracle setNullable: ALTER TABLE table MODIFY columnName columnType NOT NULL;

Sqlite: No support?

قد ينتج عن ذلك حجج غير متسقة بناءً على اللهجة التي تستخدمها. Postgres لا يريد سوى الاسم ، بينما يريد الآخرون الاسم + نوع البيانات (+ القيمة الافتراضية؟).

ما رأيك ، هل يستحق؟

اعتدنا على دعم كل من SQLite و Postgres ولكن SQLite مختلفة تمامًا بحيث لا يمكن لأي قدر من التجريد إخفاءها ... لذا ربما يكون طرح استثناء هو الشيء الصحيح في مثل هذه الحالات. تدعم عمليات الترحيل ActiveRecord في ريلز القيود المتغيرة ، فربما يكون هذا هو المكان المناسب للاستلهام؟

كان هذا ممكنا للتنفيذ بعد كل شيء. لقد قمت بعمل علاقات عامة.

+1 - لقد صادفت هذه المشكلة أيضًا ، وهي بمثابة مانع. في أي وقت تحتاج فيه إلى إجراء ترحيل يقوم بتعيين تمثيلات للأعمدة غير القابلة للإلغاء ، ستحتاج إلى ذلك.

@ morungos ليس حقًا

إذا تم الانتهاء من طلب السحب هذا ، فيمكن أيضًا إغلاق هذه المشكلة https://github.com/tgriesser/knex/pull/1759

نعم ، لقد استخدمت الرسم عدة مرات ، ولكن إذا تحولت إلى عبارات كاملة ، فإنها تبدأ في التساؤل عن الاستخدام الكامل لعمليات ترحيل الركبة. في النهاية ، استخدمت حلاً: افتراضيًا فقط على بعض القيم الغريبة غير الفارغة ، ثم طبق قواعد التعيين لتحديث القيم ، ثم أسقط الأصل. ولكن قد يكون من الصعب القيام بذلك إذا كنت تقوم بفرض النزاهة ، خاصة مع MySQL وهي عادة سيئة تتطلب النزاهة حتى أثناء الخطوات الوسيطة.

بالنسبة لأولئك الذين يأتون إلى هنا من Google ، فإن التركيب هو:

تحويل عمود موجود غير قابل للصفاء ليكون nullable (قم بعكس أعلى / أسفل إذا كنت تريد أن يكون nonNullable لاغياً).

exports.up = knex => {
  return knex.schema
    .alterTable('images', (table) => {
      table.string('checksum').nullable().alter();
    });
};

exports.down = knex => {
  return knex.schema
    .alterTable('images', table => {
      table.string('checksum').notNullable().alter();
    });
};

فقط لمعلوماتك ، إذا كنت تحاول تغيير nullable إلى nonNullable فأنت بحاجة أولاً إلى ملء هذا العمود بشيء ما ، وإلا فستتلقى خطأ.

بالنسبة لأولئك الذين يأتون إلى هنا من Google ، فإن التركيب هو:

تحويل عمود موجود غير قابل للصفاء ليكون nullable (قم بعكس أعلى / أسفل إذا كنت تريد أن يكون nonNullable لاغياً).

exports.up = knex => {
  return knex.schema
    .alterTable('images', (table) => {
      table.string('checksum').nullable().alter();
    });
};

exports.down = knex => {
  return knex.schema
    .alterTable('images', table => {
      table.string('checksum').notNullable().alter();
    });
};
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

mattgrande picture mattgrande  ·  3تعليقات

aj0strow picture aj0strow  ·  3تعليقات

saurabhghewari picture saurabhghewari  ·  3تعليقات

marianomerlo picture marianomerlo  ·  3تعليقات

fsebbah picture fsebbah  ·  3تعليقات