Я пытаюсь заставить onDelete ('CASCADE') работать на knex js, но, похоже, он не работает вообще. Вот мои knex js миграции:
const tableName = 'users'
exports.up = function(knex) {
return knex.schema.createTable(tableName, table => {
table.increments('id').primary();
table.string('username');
table.string('email');
table.string('password');
table.timestamps(true,true);
})
};
exports.down = function(knex) {
knex.schema.dropTableIfExists(tableName);
};
const tableName = 'todolists';
exports.up = function(knex) {
return knex.schema.createTable(tableName, table => {
table.increments('id').primary();
table.string('title');
table.boolean('completed').defaultTo(false);
table.timestamps(true,true);
table.integer('users_id').unsigned().notNullable();
table.foreign('users_id').references('users.id').onDelete('CASCADE');
})
};
exports.down = function(knex) {
return knex.schema.dropTableIfExists(tableName);
};
Когда я пытаюсь удалить таблицу пользователей, их соответствующие списки не удаляются и все еще ссылаются на идентификаторы удаленного пользователя.
Вот определение схемы CLI Sqlite3 и, похоже, onDelete ('CASCADE') включен.
sqlite> .schema users
CREATE TABLE `users` (`id` integer not null primary key autoincrement, `username` varchar(255), `email` varchar(255), `password` varchar(255), `created_at` datetime not null default CURRENT_TIMESTAMP, `updated_at` datetime not null default CURRENT_TIMESTAMP);
sqlite> .schema todolists
CREATE TABLE `todolists` (`id` integer not null primary key autoincrement, `title` varchar(255), `completed` boolean default '0', `created_at` datetime not null default CURRENT_TIMESTAMP, `updated_at` datetime not null default CURRENT_TIMESTAMP, `users_id` integer not null, foreign key(`users_id`) references `users`(`id`) on delete CASCADE);
Я что-то упустил?
спасибо за помощь.
РЕДАКТИРОВАТЬ: Оказывается, мне нужно было сначала поддержать внешний ключ на стороне Sqlite (это проблема, связанная с SQlite, не связанная с knex / objection js). Я запустил этот строковый код в своей программе сразу после инициализации knex js:
await knex.raw('PRAGMA foreign_keys = ON');
Это включает поддержку внешнего ключа и учитывает ограничение "при удалении CASCADE" в моем определении схемы.