【问题标题】:Knex migrations are broken after refactoring重构后 Knex 迁移被破坏
【发布时间】:2018-10-07 09:09:08
【问题描述】:

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

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

问题:将这些旧的迁移文件名保存在哪里?我需要更改哪些内容才能使其正常工作?

【问题讨论】:

    标签: knex.js


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是我的问题。我之前创建了其他迁移。然后删除了那些迁移文件。然后,当我尝试创建其他迁移时,它中断了,因为 knex_migrations 和 locks 表正在跟踪我的旧迁移。我的解决方案:删除所有表并重新开始。只有安全,因为我正在开始一个全新的项目。
    【解决方案2】:

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

    我在这里的回答很好:https://stackoverflow.com/a/61582622/7668448

    我在这里重复一遍:

    删除可以 回滚等回滚然后删除。

    或者你不能!并遵循以下内容:

    错误:迁移目录已损坏

    如果

    迁移文件被删除,而knex创建的迁移表上的记录仍然存在!

    所以简单地清除它们!

    重要的是要注意现在的迁移表是knex_migration。不知道是不是和以前不一样!

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

    我正在使用 postgres!使用 psql :

    > \d
    

    我明白了:

    您可以使用原始 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 实例!完毕!酷!

    清洗后

    迁移将运行良好!而且您的目录不再损坏! 我多么喜欢那种绿色!

    编码愉快!

    将迁移更改为仅更改(否)

    如果你和我一样喜欢直接在基础迁移中更新迁移!您可能会考虑创建一个变更迁移!运行它然后删除它!

    一个快速的流程!您只需在基础创建表上进行更新!将过去复制到新创建的更改表中!运行它然后删除它!

    如果你这么想!不要!!!

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

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

    最好创建一个以后的文件脚本!不是迁移文件!并直接运行!完成!

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

    每次你只是修改它!跑吧!

    这里是基本骨架:

    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 更好,我只使用运行代码(如果安装了运行代码扩展!这是必须的 hhhh)!

    如果没有错误,那么它运行良好!您可以查看回复!

    您可以查看文档中的schema api

    除了alter,您还需要使用alter() 方法,就像我从文档中获取的sn-p 波纹管一样:

    // ________________ 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();
    

    现在编码愉快!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多