我使用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_dump
,copy2.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:migrate
,npx sequelize db:seed:all
:一切就绪:(npx sequelize db:migrate:undo:all
:没有桌子,好npx sequelize db:migrate
、npx sequelize db:seed:all
:一切都好,外键还是好的,太棒了
因此,对于您的代码,您可以尝试以下操作:
down: async (queryInterface) => {
return await queryInterface.bulkDelete('keys', { clientKey: ['key123'] }, {restartIdentity: true});
}
希望这能有所帮助;(