有这样的东西会很方便:
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 方言移植。 这在实践中是否属实是一个完全不同的故事。