在我的Node.js应用程序中使用Knex.js删除迁移

wun*_*uno 7 javascript node.js knex.js

我试图让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'
    }
Run Code Online (Sandbox Code Playgroud)

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...');
Run Code Online (Sandbox Code Playgroud)

运行此错误,

knex migrate:latest

Using environment: development
Error: The migration directory is corrupt, the following files are missing: 20161110130954_auth_level.js
Run Code Online (Sandbox Code Playgroud)

但是这个迁移不存在,因为我删除了它.

Moh*_*lal 7

删除其中一个,您可以 回滚,然后回滚然后删除。

或者你不能!并按照以下步骤操作:

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

错误:迁移目录已损坏

如果

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

所以只需清理它们即可!

(删除然后清除,或者清除然后删除!)

需要注意的是,现在迁移表是knex_migration。不知道和以前有没有什么不同!

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

我正在使用 postgres!使用 psql :

> \d
Run Code Online (Sandbox Code Playgroud)

我得到:

在此输入图像描述

您可以使用原始 SQL 来完成!使用您的数据库终端客户端,或使用 knex 本身!或任何其他方式(编辑器客户端(pgAdmin、mysql 工作台...)。

原始sql

DELETE FROM knex_migration
WHERE knex_migration."name" IN ('20200425190608_yourMigFile.ts', ...);
Run Code Online (Sandbox Code Playgroud)

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

例如: 20200425190608_creazteUserTable.ts、20200425193758_createTestTestTable.ts

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

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

(尝试迁移时可能会出现错误)

使用 knex 本身

knex('knex_migration')
    .delete()
    .whereIn('name', ['20200425190608_yourMigFile.ts', ...]);
Run Code Online (Sandbox Code Playgroud)

创建脚本!调用您的 knex 实例!完毕!凉爽的!

清洁后

在此输入图像描述

迁移将会顺利进行!您的目录不再损坏!我是多么喜欢那绿色啊!

快乐编码!

删除迁移:(将其放下然后删除即可删除)

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

答案是删除该迁移,然后删除它的文件!

插图

knex('knex_migration')
    .delete()
    .whereIn('name', ['20200425190608_yourMigFile.ts', ...]);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

$ knex migrate:down "20200520092308_createUsersWorksTable.ts"

$ rm migrations/20200520092308_createUsersWorksTable.ts
Run Code Online (Sandbox Code Playgroud)

(从 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);
    }
})();
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

您可以在文档中查看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();
Run Code Online (Sandbox Code Playgroud)

现在编码愉快!


mar*_*man 6

您必须先回滚迁移(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 文件。 (2认同)

fse*_*dev 5

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

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

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

delete from migrations
where migrations."name" in ('20191027220145_your_migration_file.js', ...);
Run Code Online (Sandbox Code Playgroud)

编辑:迁移表名称可能会根据选项或您使用的版本而更改。
该常数设置在这里和使用存在
为了确定名称,您可以按照@MohamedAllal 的建议列出所有表

希望能帮助到你