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

Removing Migrations With Knex.js In My Node.js Application

我正在尝试让 knex 在我的 node.js 应用程序中工作。我正在学习教程并在某个时候创建​​了一个 table 但无法重复该过程。我删除了 table 并删除了所有迁移文件夹。此时我重新开始,但在创建新迁移然后 运行 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

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

您必须在删除文件之前回滚迁移 (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

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

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

对于 postgresql,它将在终端上 dropdb "db_name"see this 更多选择。

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

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

如果在 Heroku 上使用 postgresql 导航到数据库凭据并单击 "Reset Database" 按钮有效

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

Heroku run pg:reset --confirm app-name

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

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

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

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

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

希望对您有所帮助

删除要么你可以回滚然后回滚然后删除。

或者你不能!并关注以下内容:

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

错误:迁移目录已损坏

如果

会发生什么

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

所以干脆把它们清理干净!

(删除再清理,或清理再删除!)

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

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

我正在使用 postgres!使用 psql :

> \d

我得到:

你可以用 Raw SQL 来做!使用您的数据库终端客户端,或使用 knex 本身!或任何其他方式(编辑器客户端(pgAdmin,mysql workbench,...)。

原始 sql

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

注意你可以从错误信息中复制过去的文件(如果你得到它)

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

来自

Error: The migration directory is corrupt, the following files are missing: 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 migration! 运行 然后删除它!

快流!您只需对基础创建进行更新 table!将过去复制到新创建的 alter table!然后 运行 然后删除它!

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

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

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

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

我的偏好是在数据库文件夹中创建一个 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)!

如果没有错误就运行好了!您可以查看回复!

您可以在文档中查看 架构 api

此外,要 alter,您还需要使用 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();

现在编码愉快!

热修复

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

中删除迁移

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

尝试使用下面的选项,它将完全按照它所指的进行操作:

migrations: {
 disableMigrationsListValidation: true,
}

knex.js migration api

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

knex migrate:latest

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