Seria útil ter algo assim:
knex.schema.dropTable('users', true);
//OR
knex.schema.cascade().dropTable('users');
Geraria:
DROP TABLE users CASCADE;
O mesmo para .truncate
+1
Bem, isso é específico do dialeto. O que é ainda pior é que, de acordo com a documentação do MySQL , a palavra-chave CASCADE
é permitida, mas não faz absolutamente nada. (Como um aparte, o MySQL também ignora silenciosamente as restrições CHECK
e isso me mordeu no passado).
Acho que se incluirmos essa funcionalidade (o que eu gostaria), precisa haver uma implementação de fallback para dialetos que não tenham uma implementação CASCADE
adequada ou, se não houver como implementá-la com um fallback, e erro deve ser lançado.
Por exemplo, no MySQL você pode consultar INFORMATION_SCHEMA.KEY_COLUMN_USAGE
e construir um gráfico direcionado do banco de dados com nós para cada combinação table_name + '.' + column_name
e arestas de REFERENCED_TABLE_NAME.REFERENCED_COLUMN_NAME
a TABLE_NAME.COLUMN_NAME
. Em seguida, você executa uma classificação topológica no gráfico e fornece a ordem de descarte. Já fiz isso, e funciona muito bem. O bom de usar INFORMATION_SCHEMA
também é que a implementação deve ser portátil em dialetos SQL. Se isso é verdade ou não na prática é uma história totalmente diferente.
Comentários muito úteis
Bem, isso é específico do dialeto. O que é ainda pior é que, de acordo com a documentação do MySQL , a palavra-chave
CASCADE
é permitida, mas não faz absolutamente nada. (Como um aparte, o MySQL também ignora silenciosamente as restriçõesCHECK
e isso me mordeu no passado).Acho que se incluirmos essa funcionalidade (o que eu gostaria), precisa haver uma implementação de fallback para dialetos que não tenham uma implementação
CASCADE
adequada ou, se não houver como implementá-la com um fallback, e erro deve ser lançado.Por exemplo, no MySQL você pode consultar
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
e construir um gráfico direcionado do banco de dados com nós para cada combinaçãotable_name + '.' + column_name
e arestas deREFERENCED_TABLE_NAME.REFERENCED_COLUMN_NAME
aTABLE_NAME.COLUMN_NAME
. Em seguida, você executa uma classificação topológica no gráfico e fornece a ordem de descarte. Já fiz isso, e funciona muito bem. O bom de usarINFORMATION_SCHEMA
também é que a implementação deve ser portátil em dialetos SQL. Se isso é verdade ou não na prática é uma história totalmente diferente.