أحاول تغيير أحد القيود في عمود ولكن يبدو أن هذا يحاول إعادة إنشاء العمود ويفشل.
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();
});
};
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(); }); };
التعليق الأكثر فائدة
بالنسبة لأولئك الذين يأتون إلى هنا من Google ، فإن التركيب هو:
تحويل عمود موجود غير قابل للصفاء ليكون nullable (قم بعكس أعلى / أسفل إذا كنت تريد أن يكون nonNullable لاغياً).