Knex: 删除表时的级联选项

创建于 2015-09-12  ·  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_NAMETABLE_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_NAMETABLE_NAME.COLUMN_NAME的边。 然后,您在图上执行拓扑排序,它会为您提供删除顺序。 我已经这样做了,而且效果很好。 使用INFORMATION_SCHEMA的好处还在于,实现应该可以跨 SQL 方言移植。 这在实践中是否属实是一个完全不同的故事。

此页面是否有帮助?
0 / 5 - 0 等级