【问题标题】:Knex migration not working when using migration API使用迁移 API 时,Knex 迁移不起作用
【发布时间】:2017-09-04 09:09:30
【问题描述】:

我是 knex 迁移的新手,在过去的 2 天里,我一直在努力让它工作,但没有任何反应。我正在尝试使用 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_migrationsknex_migrations_locksqlite_sequence 已创建。

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

【问题讨论】:

  • 从数据库中删除 knex_migrations、knex_migrations_lock 表并重新运行。并且控制台在 catch 块上记录错误。
  • 你的目录结构和knexfile怎么样?会不会是你的迁移放在了错误的文件夹中?
  • 是的,我的迁移文件夹不在项目的根目录中,而是在子文件夹中。但我确保使用配置选项中的 migrations.direction 选项指向正确的文件夹。同样通过调试,我进入了源代码,我可以看到 Knex 找到了我的文件夹并列出了它的内容......但由于某些原因它没有运行迁移......
  • 没有属性migrations.direction。如果您在调试器中单步执行该代码,您应该能够看到为什么找不到迁移文件。无论如何,根据这个问题中给出的数据,没有办法为您提供更多帮助。尝试编写一个示例 knex 应用程序,当你开始工作时,找出你在真实应用程序上的不同之处。
  • 但是有 migrations.directory 属性。改用它。

标签: node.js migration knex.js


【解决方案1】:

不需要使用 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 Node script won't exit
    // because Knex keeps open handles.
    knex.destroy();
});

原来的问题有两个问题:

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

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

上述脚本还输出更多日志信息以查看到底发生了什么。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2023-03-14
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多