在我的 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
由于您正在使用种子和迁移文件进行开发,因此您可以重新创建表和数据,您可以使用可用的 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_migrations 和 knex_migrations_lock 的表之外,还会有另外两个表.删除这两个文件和您创建的其他表。那么运行
knex migrate:latest
注意:这将从数据库中删除所有数据(如果您将其用于开发,那很好)
我正在尝试让 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
由于您正在使用种子和迁移文件进行开发,因此您可以重新创建表和数据,您可以使用可用的 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_migrations 和 knex_migrations_lock 的表之外,还会有另外两个表.删除这两个文件和您创建的其他表。那么运行
knex migrate:latest
注意:这将从数据库中删除所有数据(如果您将其用于开发,那很好)