Ce serait pratique d'avoir quelque chose comme ça :
knex.schema.dropTable('users', true);
//OR
knex.schema.cascade().dropTable('users');
Génèrerait :
DROP TABLE users CASCADE;
Idem pour .truncate
+1
Eh bien, c'est spécifique au dialecte. Ce qui est encore pire, c'est que selon la documentation MySQL , le mot-clé CASCADE
est autorisé mais ne fait absolument rien. (En passant, MySQL ignore aussi silencieusement les contraintes CHECK
et cela m'a mordu dans le passé).
Je pense que si nous incluons cette fonctionnalité (ce que j'aimerais), il doit y avoir une implémentation de secours pour les dialectes qui n'ont pas une implémentation appropriée CASCADE
ou, s'il n'y a aucun moyen de l'implémenter avec une solution de secours et une erreur devrait être jeté.
Par exemple, dans MySQL, vous pouvez interroger INFORMATION_SCHEMA.KEY_COLUMN_USAGE
et construire un graphe orienté de la base de données avec des nœuds pour chaque combinaison table_name + '.' + column_name
et des arêtes de REFERENCED_TABLE_NAME.REFERENCED_COLUMN_NAME
à TABLE_NAME.COLUMN_NAME
. Vous effectuez ensuite un tri topologique sur le graphe et celui-ci vous donne l'ordre de dépôt. Je l'ai fait, et ça marche plutôt bien. La bonne chose à propos de l'utilisation INFORMATION_SCHEMA
est également que l'implémentation doit être portable dans tous les dialectes SQL. Que cela soit vrai ou non dans la pratique est une toute autre histoire.
Commentaire le plus utile
Eh bien, c'est spécifique au dialecte. Ce qui est encore pire, c'est que selon la documentation MySQL , le mot-clé
CASCADE
est autorisé mais ne fait absolument rien. (En passant, MySQL ignore aussi silencieusement les contraintesCHECK
et cela m'a mordu dans le passé).Je pense que si nous incluons cette fonctionnalité (ce que j'aimerais), il doit y avoir une implémentation de secours pour les dialectes qui n'ont pas une implémentation appropriée
CASCADE
ou, s'il n'y a aucun moyen de l'implémenter avec une solution de secours et une erreur devrait être jeté.Par exemple, dans MySQL, vous pouvez interroger
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
et construire un graphe orienté de la base de données avec des nœuds pour chaque combinaisontable_name + '.' + column_name
et des arêtes deREFERENCED_TABLE_NAME.REFERENCED_COLUMN_NAME
àTABLE_NAME.COLUMN_NAME
. Vous effectuez ensuite un tri topologique sur le graphe et celui-ci vous donne l'ordre de dépôt. Je l'ai fait, et ça marche plutôt bien. La bonne chose à propos de l'utilisationINFORMATION_SCHEMA
est également que l'implémentation doit être portable dans tous les dialectes SQL. Que cela soit vrai ou non dans la pratique est une toute autre histoire.