【问题标题】:Removing Migrations With Knex.js In My Node.js Application在我的 Node.js 应用程序中使用 Knex.js 删除迁移
【发布时间】:2017-03-26 01:42:42
【问题描述】:

我正在尝试让 knex 在我的 node.js 应用程序中工作。我正在关注一个教程,并在某个时候创建​​了一个表格,但无法重复该过程。我删除了表并删除了所有迁移文件夹。此时我重新开始,但在创建新迁移然后运行knex migrate:latest 后,我收到一条错误消息,指出迁移目录已损坏,因为我的原始迁移丢失了。

我的印象是,如果文件丢失,它不应该知道它曾经在那里。

从我的项目中删除迁移的正确方法是什么?

knexfile.js

 development: {
    client: 'pg',
    connection: {
    host: '127.0.0.1',
    user:     'postgres',
    password: 'password',
    database: 'myDatabase'
    },
     pool: {
      min: 10,
      max: 20
    },
    migrations: {
      directory: __dirname + '/db/migrations'
    },
    seeds: {
      directory: __dirname + '/db/seeds/development'
    }

db.js

var config      = require('../knexfile.js');  
var env         = 'development';  
var knex        = require('knex')(config[env]);

module.exports = knex;
console.log('Getting knex');
knex.migrate.latest([config]); 
console.log('Applying migration...');

运行会报错,

knex migrate:latest

Using environment: development
Error: The migration directory is corrupt, the following files are missing: 20161110130954_auth_level.js

但此迁移不存在,因为我删除了它。

【问题讨论】:

    标签: javascript node.js knex.js


    【解决方案1】:

    您必须在删除文件之前回滚迁移(knex migrate:rollback),我想您可以做的是:

    touch [full_path_to_migrations_here]/migrations/20161110130954_auth_level.js

    knex migrate:rollback

    rm [full_path_to_migrations_here]/migrations/20161110130954_auth_level.js

    参考这里 https://github.com/tgriesser/knex/issues/1569

    【讨论】:

    • 为了删除迁移,我最终进入数据库并删除与迁移相关的行,然后删除与之关联的 js 文件。
    • 我仍然面临同样的问题..应该是ressetting的东西
    • 很好的解决方案,但是您使用touch 创建的文件需要空的上下导出功能。
    【解决方案2】:

    由于您正在使用种子和迁移文件进行开发,因此您可以重新创建表和数据,您可以使用可用的 knex 迁移删除并重新创建数据库。

    我的开发环境使用 sqlite,所以终端上的rm -rf dev.sqlite3 修复了这个问题。

    使用 postgresql,它会在终端上为 dropdb "db_name" 或see this 以获得更多替代方案。

    这很简单,之后不需要回滚。

    有关您旧迁移的记录已消失,您可以使用新的 knex migrate:latest 重新创建它。

    【讨论】:

      【解决方案3】:

      如果在 Heroku 上使用 postgresql,请导航到数据库凭据并单击“重置数据库”按钮有效

      【讨论】:

        【解决方案4】:

        您可以通过运行此命令来重置数据库。

        Heroku run pg:reset --confirm app-name
        

        【讨论】:

          【解决方案5】:

          您的迁移文件已被删除, 但它们仍然在名为“迁移”的表中被引用
          (见下面的更新),这是由 knex 生成的。

          您应该可以通过连接到本地数据库来检查它。

          我遇到了同样的问题,我通过删除与我已删除的迁移文件对应的记录来解决它。

          delete from migrations
          where migrations."name" in ('20191027220145_your_migration_file.js', ...);
          

          编辑:migrations 表名可能会根据the options 或您使用的版本而更改。
          常量设置为here 并使用there。
          为了确定名称,您可以按照@MohamedAllal 的建议list all tables。

          希望对你有帮助

          【讨论】:

            【解决方案6】:

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

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

            (>下面,也回答你可能已经看到的以下错误:

            错误:迁移目录已损坏

            如果

            迁移文件被删除,而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 实例!完毕!酷!

            清洗后

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

            编码愉快!

            删除迁移:(将其关闭,然后删除以删除)

            删除迁移的正确方法是什么?

            答案是关闭一个迁移,然后删除它的文件!

            插图

            $ knex migrate:down "20200520092308_createUsersWorksTable.ts"
            
            $ rm migrations/20200520092308_createUsersWorksTable.ts
            

            您可以列出要检查的迁移,如下所示

            $ knex migrate:list
            

            (从 v0.19.3 开始!如果不可用,请更新 knex (npm i -g 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();
            

            现在编码愉快!

            【讨论】:

              【解决方案7】:

              热修复

              问题正在发生,因为删除的迁移仍然是数据库中的knex_migrations 表,因此knex_migrations 表与工作目录中的迁移文件不匹配。您必须从 knex_migrations 表中删除迁移。

              删除 从 knex_migrations 公里 其中 km."name" = 'deleted_migration.js'

              【讨论】:

                【解决方案8】:

                尝试使用下面的选项,它将完全按照它所指的方式:

                migrations: {
                 disableMigrationsListValidation: true,
                }
                

                knex.js migration api

                【讨论】:

                  【解决方案9】:

                  转到您正在使用的图形用户界面查看数据库和表中的数据,除了您创建的名为 knex_migrations 和 knex_migrations_lock 的表之外,还有另外两个表。删除您创建的这两个文件和其他表。然后运行

                  knex migrate:latest
                  

                  注意:这将从数据库中删除所有数据(如果您将其用于开发,那很好)

                  【讨论】:

                    猜你喜欢
                    • 2019-08-29
                    • 2015-04-08
                    • 1970-01-01
                    • 2018-02-07
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-08-15
                    • 2019-12-29
                    • 1970-01-01
                    相关资源
                    最近更新 更多