Knex 以编程方式迁移最新版本

Posted

技术标签:

【中文标题】Knex 以编程方式迁移最新版本【英文标题】:Knex migrate latest programmatically 【发布时间】:2017-10-10 16:55:57 【问题描述】:

我正在尝试在启动节点应用程序时跟踪内容。我需要将我的 db 对象导出到其他模块,所以我需要导出 db。

问题是迁移代码可能会出错,但由于 nodejs 的异步特性,db config 已经导出。我希望同步以下代码,以便仅在迁移完成后才会进行导出。

解决此问题的另一种方法可能是从迁移部分抽象出数据库初始化,但如果迁移失败,我希望应用程序关闭。

/*
  1. Db init
  2. Migration stuff
*/
const db = knex(config);
(async () => 
try 
    const migrate = async () => db.migrate.latest();
    await migrate();
 catch(ex) 
    console.log('Error migrating: ', ex);

)();

module.exports = db;

【问题讨论】:

【参考方案1】:

无法延迟模块的导出。

如果您想在出错时退出,您可以在catch 块中简单地添加process.exit()

但是,我建议您在主文件中添加一个初始化“守卫”。我所做的是将应用程序启动之前需要完成的所有初始化代码放入一个返回Promise(或接受回调)的函数中,将此函数导入我的主文件中,然后只导入应用程序的其余部分一旦成功。

例子:

init.js:

var db;

function initialize(callback) 
    try 
        db = initializeDatabase();
        callback(null);
     catch (ex) 
        callback(ex);
    


exports.initialize = initialize;
exports.db = db;

main.js:

const init = require('./init.js');

init.initialize(function (error) 
    if (error) console.log("Initialization failed with error: " + error.toString());
    else 
        const file1 = require('./file1.js');
        const file2 = require('./file2.js');
        // Import the rest of the application...
    
);

现在,当您在file1.jsfile2.js 中导入db 时,您可以确定初始化和迁移确实成功了。

【讨论】:

以上是关于Knex 以编程方式迁移最新版本的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式查找最新 Qt 版本号的最简单方法是啥?

以编程方式安装或更新到最新版本的全局包的最快方法是啥?

以编程方式编写 TFS 命令行以获取最新版本、签出和签入

solr 的最新稳定版本

VMWare实践:命令行方式升级ESXI6.7到最新版本

将所有环境迁移到最新版本后,是不是有理由保留 EF 迁移代码?