重构后,Knex迁移中断

时间:2018-10-07 09:09:09

标签: knex.js

为了简洁起见,我重构了迁移,并更新了MySQL中的knex_migrations表。但是,当我运行migration:latest命令时,出现以下错误消息:

  

错误:迁移目录已损坏,缺少以下文件:[旧迁移文件名列表]

问题:这些旧的迁移文件名保存在哪里?要使其正常工作,我需要更改什么?

2 个答案:

答案 0 :(得分:1)

您的问题和错误抱怨您删除了迁移文件!

我在这里的答案很好地说明了这一点:https://stackoverflow.com/a/61582622/7668448

我在这里重复它:

删除,您可以 回滚,然后回滚然后删除。

否则你就不能!并按照以下说明进行操作:

错误:迁移目录已损坏

如果发生哪种情况

删除迁移文件,而保留由knex创建的迁移表上的记录!

所以只需清除它们即可!

目前要注意的迁移表是knex_migration。不知道过去是否有所不同!

但是最好列出数据库表以确保!

我正在使用postgres!使用psql:

> \d

我得到:

enter image description here

您可以使用Raw SQL做到这一点!使用您的数据库终端客户端,或者使用knex本身!或任何其他方式(编辑器客户端(pgAdmin,mysql工作台等)。

原始sql

DELETE FROM knex_migration
WHERE knex_migration."name" IN ('20200425190608_yourMigFile.ts', ...);

注意,您可以复制错误消息中的文件(如果得到的话)

示例::20200425190608_creazteUserTable.ts,20200425193758_createTestTestTable.ts

来自

错误:迁移目录已损坏,缺少以下文件:20200425190608_creazteUserTable.ts,20200425193758_createTestTestTable.ts

复制过去!而且速度很快!

(您可以通过尝试迁移来获取错误)

使用knex本身

knex('knex_migration')
    .delete()
    .whereIn('name', ['20200425190608_yourMigFile.ts', ...]);

创建一个脚本!调用您的knex实例!做完了!太酷了!

清洁后

enter image description here

迁移将顺利进行!而且您的目录不再损坏! 我有多爱那个绿色!

祝您编程愉快!

更改迁移仅进行更改(否)

如果您像我一样,并且喜欢直接在基本迁移中更新迁移!您可能会考虑创建替代迁移!运行它,然后将其删除!

快速流动!您只需在基本创建表上进行更新!复制过去到新创建的alter表中!并运行它,然后将其删除!

如果您这样想!不要!!!

无法回滚,因为这是您想要的更改!您无法取消它们!

您可以做到!然后,您必须清除记录!否则您会得到错误!而且不酷!

更好地创建更高版本的文件脚本!不是迁移文件!并直接运行它!完成!

我的首选是在数据库文件夹中创建一个alter.ts(.js)文件! 然后在那里创建alter schema代码!并创建一个npm脚本来运行它!

enter image description here

每次您只需对其进行修改!跑!

这里是基本骨架:

import knex from './db';

(async () => {
    try {
        const resp = await knex.schema.alterTable('transactions', (table) => {
            table.decimal('feeAmount', null).nullable();
        });
        console.log(resp);
    } catch (err) {
        console.log(err);
    }
})();

vscode更好,我只使用运行代码(如果安装了运行代码扩展!这是必须的)!

enter image description here

如果没有错误,那就可以正常运行!您可以检查响应!

您可以在文档中查看 schema api

更改,您还需要使用alter()方法,就像我从文档中获取的摘要所示:

// ________________ alter fields
// drops previous default value from column, change type
// to string and add not nullable constraint
table.string('username', 35).notNullable().alter();
// drops both not null constraint and the default value
table.integer('age').alter();

现在快乐编码!

答案 1 :(得分:0)

在将迁移应用到数据库后,您不应更改迁移,您将再也无法确定新安装实际上具有与运行旧迁移的数据库相同的架构。

无论如何,如果您确定没有犯任何错误,则有一个名为knex_migrations的表。默认情况下,它包含已针对数据库运行的所有迁移文件的列表。您可以编辑该表的内容以匹配您在迁移文件目录中拥有的文件名,并且一切都应该可以正常工作。

与例如休眠(或liquibase)相比,knex不存储每个文件内容的任何哈希,因此匹配的文件名就足够了。