Sequelize queryInterface bulkDelete不重置id序列



我使用pg_dump复制数据库copy1.sql

我运行了一个向上迁移来创建一个新的实例

up: asyn (queryInterface) => {
return await queryInterface.bulkInsert('keys', [{ clientKey: 'key123' }]);
}

我运行向下迁移以删除实例

down: async (queryInterface) => {
return await queryInterface.bulkDelete('keys', { clientKey: ['key123'] });
}

我做数据库的另一个pg_dumpcopy2.sql。我将数据库的第一个副本与数据库的第二个副本进行比较,以表明通过运行bash脚本向下迁移可以正常工作diff "copy1.sql" "copy2.sql"

区别在于

-SELECT pg_catalog.setval('public.keys_id_seq', 6, true);
+SELECT pg_catalog.setval('public.keys_id_seq', 7, true);

这使得我的测试失败,因为由于这种差异,两个数据库的副本不完全相同。尽管我删除了那个密钥,但根据这份文档,下一个id序列将从8开始,而不是7。当前存在的表行为1到6行。有没有办法删除实例,使序列从7而不是8开始?这意味着数据库的两个副本都应该有

SELECT pg_catalog.setval('public.keys_id_seq', 6, true);

我能提供哪些选择吗?也许像

down: async (queryInterface) => {
return await queryInterface.bulkDelete('keys', { clientKey: ['key123'] }, { resetIdSequence: true });
}

您可以使用truncate table命令重置序列。Truncate table命令擦除所有表数据。例如:

truncate table table_name restart identity; 

使用setval进行二路手动复位。示例:

select setval('your_table_id_seq', 1, false);

如果不删除所有表数据,则建议将序列值设置为记录的最大id。示例:

select setval('your_table_id_seq', COALESCE((select max(id)+1 from your_table), 1), false);

我知道对你来说可能为时已晚,但我也遇到了同样的问题,并通过在迁移文件中添加{restartIdentity: true}来解决,如下所示(我的一个表的示例(:

async down(queryInterface, Sequelize) {
await queryInterface.dropTable('card', {restartIdentity: true});
}

为了确保它有效,我尝试了几个";"转弯";终端上有这些命令:

  • npx sequelize db:migratenpx sequelize db:seed:all:一切就绪:(
  • npx sequelize db:migrate:undo:all:没有桌子,好
  • npx sequelize db:migratenpx sequelize db:seed:all:一切都好,外键还是好的,太棒了

因此,对于您的代码,您可以尝试以下操作:

down: async (queryInterface) => {
return await queryInterface.bulkDelete('keys', { clientKey: ['key123'] }, {restartIdentity: true});
}

希望这能有所帮助;(

相关内容

  • 没有找到相关文章

最新更新