فمثلا،
ALTER TABLE users ADD UNIQUE KEY(LoginID, Email);
ALTER TABLE users ADD UNIQUE KEY(Email);
ALTER TABLE users ADD UNIQUE KEY(LoginID);
كيف أفعل ذلك باستخدام Knex.Schema.createTable
أعتقد أنه يجب أن تكون قادرًا على القيام بذلك من خلال:
Knex.Schema.createTable('tableName', function(table) {
table.unique(['LoginID', 'Email']);
table.unique('LoginID');
table.unique('Email');
});
اسمحوا لي أن أعرف إذا كان يبدو أنه لا يعمل.
يعمل شكرا! التحضير للتبديل من Sequelize.
أحاول تشغيل الهجرة
knex.schema.createTable('users', function (table) {
table.increments('id').primary();
table.string('network', 3).notNullable();
table.string('uid', 64).notNullable();
table.unique(['network', 'uid']);
table.timestamps();
}).then(function () {
console.log('Users Table is Created!');
});
لكني لن أحصل على فهرس فريد
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`network` varchar(3) NOT NULL,
`uid` varchar(64) NOT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
ما يمكن ان يكون خطأ؟
@ theo-ptz تغيرت واجهة برمجة التطبيقات منذ فترة. وفقًا للمستندات ، أصبح unique
الآن طريقة قابلة للتسلسل يمكنك استخدامها بنفس الطريقة التي تستخدم بها primary
و notNullable
.
bendrucker ، شكرا.
لكن شيئًا ما لا يعمل.
أحاول تشغيل هذا الرمز
knex.schema.createTable('users', function (table) {
table.increments('id').primary();
table.string('network', 3).notNullable();
table.string('uid', 64).unique();
table.timestamps();
})
لقد رأيت هذا في التصحيح
مستخدمون
--> ComQueryPacket
{ command: 3,
sql: 'create table
(
id int(11) unsigned not null auto_increment primary key,
network varchar(3) not null,
uid varchar(64),
created_at datetime,
updated_at datetime) default character set utf8' }
لم أحصل على فهرس.
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`network` varchar(3) NOT NULL,
`uid` varchar(64) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
ما يمكن ان يكون خطأ؟
هل هناك طريقة لإنشاء فهرس فريد مركب في الترحيل؟
راجع اختبارات التكامل للحصول على مثال لقيد فريد مركب:
https://github.com/tgriesser/knex/blob/master/test/integration/schema/index.js#L92
bendrucker عند الارتباط بملف مصدر ، يرجى استخدام علامة / الالتزام بدلاً من الرئيسي:
الرابط الذي لم يعد يعمل: https://github.com/tgriesser/knex/blob/master/test/integration/schema/index.js#L92
مقابل ما قصدته: https://github.com/tgriesser/knex/blob/0.5.11/test/integration/schema/index.js#L92
وباستخدام أحدث إصدار (0.8.6): https://github.com/tgriesser/knex/blob/0.8.6/test/integration/schema/index.js#L157
نصيحة: إذا ضغطت على مفتاح "y" أثناء التصفح على github ، فإنه يتحول إلى عنوان url الحالي للملف الحالي الذي تشاهده. مريح للغاية ، أتمنى أن يقوم جيثب بذلك تلقائيًا عند لصق عنوان url في أحد التعليقات
هل تم إهمال هذه الميزة لأنها ليست في الوثائق؟
RichardSimko وفقًا لمجموعة الاختبار ، لا يزال بناء الجملة table.unique([...])
للمفاتيح المركبة مدعومًا ، لذلك يبدو أنه خطأ في الوثائق.
نعم ، لقد أدركت أنه لا يزال يعمل ، كنت قلقًا فقط من أنه على وشك الإزالة نظرًا لعدم وجوده في المستندات.
إذن ما الفرق بين table.unique([...])
و table.primary([...])
؟
وفقًا للمستندات ، يبدو أن استخدام primary([...])
هو الطريقة الصحيحة لعمل المفاتيح الأساسية المركبة:
عندما يتم استدعاؤه في عمود واحد ، سيتم تعيين هذا العمود كمفتاح أساسي للجدول. لإنشاء مفتاح أساسي مركب ، مرّر مصفوفة من أسماء الأعمدة:
table.primary(['column1', 'column2'])
. اسم القيد الافتراضي هوtablename_pkey
ما لم يتم تحديدconstraintName
.
http://knexjs.org/#Schema -Primary
التعليق الأكثر فائدة
أعتقد أنه يجب أن تكون قادرًا على القيام بذلك من خلال:
اسمحوا لي أن أعرف إذا كان يبدو أنه لا يعمل.