Knex Js - Sqlite3 при каскаде удаления не работает - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь заставить 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" в моем определении схемы.

1 Ответ

0 голосов
/ 19 января 2020

Я пытаюсь заставить 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');

Это включает поддержку внешнего ключа и учитывает ограничение "on delete CASCADE" в моем определении схемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...