Knex: Каскадный вариант при удалении таблицы

Созданный на 12 сент. 2015  ·  3Комментарии  ·  Источник: knex/knex

Было бы удобно иметь что-то вроде этого:

knex.schema.dropTable('users', true);

//OR

knex.schema.cascade().dropTable('users');

Будет генерировать:

DROP TABLE users CASCADE;

Самый полезный комментарий

Ну, это специфика диалекта. Еще хуже то, что, согласно документации MySQL , ключевое слово CASCADE разрешено, но абсолютно ничего не делает. (Кроме того, MySQL также молча игнорирует ограничения CHECK , и это меня укусило в прошлом).

Я думаю, что если мы включим эту функциональность (что мне бы хотелось), то либо должна быть резервная реализация для диалектов, в которых отсутствует надлежащая реализация CASCADE , либо, если нет возможности реализовать ее с помощью резервной копии, и ошибка следует бросить.

Например, в MySQL вы можете запросить INFORMATION_SCHEMA.KEY_COLUMN_USAGE и построить ориентированный граф базы данных с узлами для каждой комбинации table_name + '.' + column_name и ребрами от REFERENCED_TABLE_NAME.REFERENCED_COLUMN_NAME до TABLE_NAME.COLUMN_NAME . Затем вы выполняете топологическую сортировку на графике, и она дает вам порядок отбрасывания. Я сделал это, и это работает довольно хорошо. Преимуществом использования INFORMATION_SCHEMA также является то, что реализация должна быть переносимой между диалектами SQL. Верно ли это на практике — это совсем другая история.

Все 3 Комментарий

То же самое для .truncate

+1

Ну, это специфика диалекта. Еще хуже то, что, согласно документации MySQL , ключевое слово CASCADE разрешено, но абсолютно ничего не делает. (Кроме того, MySQL также молча игнорирует ограничения CHECK , и это меня укусило в прошлом).

Я думаю, что если мы включим эту функциональность (что мне бы хотелось), то либо должна быть резервная реализация для диалектов, в которых отсутствует надлежащая реализация CASCADE , либо, если нет возможности реализовать ее с помощью резервной копии, и ошибка следует бросить.

Например, в MySQL вы можете запросить INFORMATION_SCHEMA.KEY_COLUMN_USAGE и построить ориентированный граф базы данных с узлами для каждой комбинации table_name + '.' + column_name и ребрами от REFERENCED_TABLE_NAME.REFERENCED_COLUMN_NAME до TABLE_NAME.COLUMN_NAME . Затем вы выполняете топологическую сортировку на графике, и она дает вам порядок отбрасывания. Я сделал это, и это работает довольно хорошо. Преимуществом использования INFORMATION_SCHEMA также является то, что реализация должна быть переносимой между диалектами SQL. Верно ли это на практике — это совсем другая история.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги