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)
但是这个迁移不存在,因为我删除了它.
要删除其中一个,您可以 回滚,然后回滚然后删除。
或者你不能!并按照以下步骤操作:
(> 下面,也回答您可能已经看到的以下错误:<)
如果
迁移文件被删除,而 knex 创建的迁移表上的记录仍然保留在那里!
所以只需清理它们即可!
(删除然后清除,或者清除然后删除!)
需要注意的是,现在迁移表是knex_migration。不知道和以前有没有什么不同!
但最好列出数据库表以确保!
我正在使用 postgres!使用 psql :
> \d
Run Code Online (Sandbox Code Playgroud)
我得到:
您可以使用原始 SQL 来完成!使用您的数据库终端客户端,或使用 knex 本身!或任何其他方式(编辑器客户端(pgAdmin、mysql 工作台...)。
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_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)
现在编码愉快!
您必须先回滚迁移(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 生成的名为“迁移”的表中引用(请参阅下面的更新)。
您应该能够通过连接到本地数据库来检查它。
我遇到了同样的问题,我通过删除与我删除的迁移文件对应的记录来解决它。
delete from migrations
where migrations."name" in ('20191027220145_your_migration_file.js', ...);
Run Code Online (Sandbox Code Playgroud)
编辑:迁移表名称可能会根据选项或您使用的版本而更改。
该常数设置在这里和使用存在。
为了确定名称,您可以按照@MohamedAllal 的建议列出所有表。
希望能帮助到你
| 归档时间: |
|
| 查看次数: |
7086 次 |
| 最近记录: |