Было бы удобно иметь что-то вроде этого:
knex.schema.dropTable('users', true);
//OR
knex.schema.cascade().dropTable('users');
Будет генерировать:
DROP TABLE users CASCADE;
То же самое для .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. Верно ли это на практике — это совсем другая история.
Самый полезный комментарий
Ну, это специфика диалекта. Еще хуже то, что, согласно документации 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. Верно ли это на практике — это совсем другая история.