Knex迁移无法正常运行

时间:2017-04-09 07:43:23

标签: node.js migration knex.js

我是knex迁移的新手,在过去的两天里,我一直在努力让它工作但没有任何事情发生。我正在尝试使用knex.migration对象以编程方式运行迁移。

首先使用cli,我在迁移目录中创建一个迁移文件。以下是其内容:

exports.up = function(knex, Promise) {
   return Promise.all([
        knex.schema.createTable('users', function (table) {
            table.increments('id').primary();
            table.string('username');
            table.string('password');
            table.string('email');
            table.string('name');
            table.timestamp('date');
        }),
    ]);
};

exports.down = function(knex, Promise) {

};

然后从我的代码中初始化Knex对象:

var knex = Knex({
        client:'sqlite3',
        connection:{
            filename: './knex.sqlite'
        }
    });

然后我执行迁移:

knex.migrate.latest().then(()=>{
        // console.log()
    }).catch(err =>{
        // 
    });

但绝对没有任何反应。我的迁移文件永远不会执行,也没有错误或警告消息。所以我不知道从哪里开始寻找问题。当我查看我的sqlite数据库时,我可以看到已经创建了表 knex_migrations knex_migrations_lock sqlite_sequence

那我在这里做错了什么?有什么我想念的吗? 感谢您的任何建议

2 个答案:

答案 0 :(得分:0)

Knex迁移应该由Knex CLI运行,仅供参考:https://knexjs.org/#Migrations

如您的代码所述,我发现了一个奇怪的问题:

knex.migrate实际上是未定义的,它不是knex的属性。

答案 1 :(得分:0)

不需要使用CLI工具。有时由于其局限性而无法使用它,在这种情况下,确实有可能直接使用迁移API,例如:

const knex = require('knex')({
    // Here goes the Knex config
});

const migrationConfig = {
    directory: __dirname + './migrations',
}

console.info('Running migrations in: ' + migrationConfig.directory);

knex.migrate.latest(migrationConfig).then(([batchNo, log]) => {
    if (!log.length) {
        console.info('Database is already up to date');
    } else {
        console.info('Ran migrations: ' + log.join(', '));
    }

    // Important to destroy the database, otherwise if Node script won't exit
    // because Knex keeps open handles.
    knex.destroy();
});

原始问题有两个问题:

  1. 未指定迁移目录-在这种情况下,Knex并不聪明,只会做任何事情而不是抛出错误。 Knex使用的默认值很可能不正确,因此最好指定它。

  2. knex.destroy()丢失。在这种情况下,该脚本将永远不会退出,因为Knex会在数据库上保持打开句柄,因此看起来好像什么都没做。

上面的脚本还输出更多日志信息,以查看实际情况。