【发布时间】:2018-10-07 09:09:08
【问题描述】:
为了简洁起见,我重构了我的迁移,并更新了 MySQL 中的 knex_migrations 表。但是,当我运行 migrate:latest 命令时,我收到以下错误消息:
错误:迁移目录已损坏,缺少以下文件:[旧迁移文件名列表]
问题:将这些旧的迁移文件名保存在哪里?我需要更改哪些内容才能使其正常工作?
【问题讨论】:
标签: knex.js
为了简洁起见,我重构了我的迁移,并更新了 MySQL 中的 knex_migrations 表。但是,当我运行 migrate:latest 命令时,我收到以下错误消息:
错误:迁移目录已损坏,缺少以下文件:[旧迁移文件名列表]
问题:将这些旧的迁移文件名保存在哪里?我需要更改哪些内容才能使其正常工作?
【问题讨论】:
标签: knex.js
您不应该在迁移应用到您的数据库后更改迁移,您将无法确定新安装实际上与运行旧迁移的数据库具有相同类型的架构。
无论如何,如果您确定自己没有犯任何错误,则有一个名为 knex_migrations 的表。默认情况下,它包含针对您的数据库运行的所有迁移文件的列表。您可以编辑该表的内容以匹配您在迁移文件目录中的文件名,并且一切都应该开始正常工作。
与例如 hibernate(或 liquibase)相比,knex 不存储每个文件内容的任何哈希值,因此匹配文件名就足够了。
【讨论】:
您的问题和错误是抱怨您删除的迁移文件!
我在这里的回答很好:https://stackoverflow.com/a/61582622/7668448
我在这里重复一遍:
要删除您可以 回滚等回滚然后删除。
或者你不能!并遵循以下内容:
如果
迁移文件被删除,而knex创建的迁移表上的记录仍然存在!
所以简单地清除它们!
重要的是要注意现在的迁移表是knex_migration。不知道是不是和以前不一样!
但最好列出数据库表以确保!
我正在使用 postgres!使用 psql :
> \d
我明白了:
您可以使用原始 SQL 做到这一点!使用您的数据库终端客户端,或者使用 knex 本身!或任何其他方式(编辑器客户端(pgAdmin、mysql 工作台,...)。
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_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();
现在编码愉快!
【讨论】: