【问题标题】:Knex migration in postgres Heroku - Error: Unable to acquire connectionpostgres Heroku中的Knex迁移-错误:无法获取连接
【发布时间】:2017-05-28 18:01:02
【问题描述】:

我正在尝试运行我的第一次迁移,它在 Heroku postgres 数据库中创建一个表。

当我尝试运行 knex migrate:latest --env development 时收到错误消息

错误:无法获取连接

我尝试过的事情:

  • ?ssl=true 添加到存储在process.env.LISTINGS_DB_URL 中的连接字符串的末尾,因为我知道这有时是连接heroku 的要求
  • 设置环境变量PGSSLMODE=require

我还偶然发现了this article,有人评论说 knex 不会接受基于环境的密钥。但是,我试图跟随this tutorial,这表明它确实如此。我还看到了许多其他参考资料,这些参考资料强化了这一点。

我还要补充一点,我已经能够从我的应用程序和外部客户端连接到数据库。我只是在尝试运行 knex 迁移时遇到此错误。

此外,我尝试确定如何检查作为连接字符串发送的内容。一边看knex documentation

如何调试常见问题解答

如果您将 {debug: true} 作为初始化中的选项之一传递 设置,你可以看到所有的查询调用。

有人可以帮助指导我如何实际执行此操作吗?还是我已经在我的 knexfile.js 中成功地做到了?

相关文件:

// knex.js:

var environment = process.env.NODE_ENV || 'development';
var config = require('../knexfile.js')[environment];

module.exports = require('knex')(config);



// knexfile.js:

module.exports = {

    development: {
        client: 'pg',
        connection: process.env.LISTINGS_DB_URL,
        migrations: {
            directory: __dirname + '/db/migrations'
        },
        seeds: {
            directory: __dirname + '/db/seeds'
        },
        debug: true
    },

    staging: {
        client: 'postgresql',
        connection: {
            database: 'my_db',
            user: 'username',
            password: 'password'
        },
        pool: {
            min: 2,
            max: 10
        },
        migrations: {
            tableName: 'knex_migrations'
        }
    },

    production: {
        client: 'postgresql',
        connection: {
            database: 'my_db',
            user: 'username',
            password: 'password'
        },
        pool: {
            min: 2,
            max: 10
        },
        migrations: {
            tableName: 'knex_migrations'
        }
    }

};

【问题讨论】:

    标签: node.js heroku database-migration knex.js heroku-postgres


    【解决方案1】:

    如果您在 nodejs 中遇到此错误,请尝试删除此行

    myDb.destroy().then();
    

    【讨论】:

      【解决方案2】:

      我在同样的情况下收到了同样的错误。原来我忘记在迁移之前配置数据库,所以没有什么可以连接的。

      要修复此错误,

      运行前:

      heroku run knex migrate:latest
      

      我运行了这个命令:

      heroku addons:create heroku-postgresql
      

      而且效果很好。

      【讨论】:

        【解决方案3】:

        第 1 步:

        首先安装dotenv:

        npm i dotenv --save
        

        在你的项目根目录下创建一个.env文件,添加:

        DATABASE_URL=postgres://...
        

        第 2 步:

        knexfile.js的开头,添加:

        require('dotenv').config();
        

        将 postgres 连接更改为:

        {
          client: 'postgresql',
          connection: process.env.DATABASE_URL,
          pool: {
            min: 0,
            max: 15
          },
          migrations: {
            directory: ...
          },
          seeds: {
            directory: ...
          }
        }
        

        【讨论】:

        • 您不应该在 Heroku 中使用 dotenv,它提供了一种从 UI 和命令行设置环境变量的方式。
        【解决方案4】:

        正如@hhoburg 在下面的 cmets 中所指出的,错误 Error: Unable to acquire a connection 是一条通用消息,表明 Knex client configuration 存在某些错误。见here

        在我的例子中,Knex 没有在 knexfile.js 中引用 process.env.LISTINGS_DB_URL,因为:

        • 该变量是在我的 .env 文件中设置的
        • dotenv module 未被 Knex 引用/调用

        knex 问题跟踪器here 中详细介绍了正确的设置方法。

        【讨论】:

          【解决方案5】:

          我不确定这是否会有所帮助,但我今天开始在本地环境中遇到同样的问题。经过太多搜索,我发现this is the new error message 的连接配置无效或连接池丢失。在摆弄了太久之后,我将连接切换为使用我的 .env 文件作为配置环境;我一直在我的 knex.js 文件中使用硬编码字符串 ('dev'),但由于某种原因它不起作用。

          您的 .env 文件是否正常工作?您是否尝试弄乱池设置,并且您确定您的用户名和密码对于暂存和生产数据库是正确的?

          希望这个链接对你有帮助!

          【讨论】:

          • 谢谢!虽然它没有直接解决问题,但它确实将我的故障排除集中在环境配置上。我已经在我的项目中安装了 dotenv,但是在从 cli 执行迁移时 knex 没有引用它。对“knex 和 dotenv”的一次搜索将我带到了github.com/tgriesser/knex/issues/590,它有答案。
          猜你喜欢
          • 1970-01-01
          • 2021-05-11
          • 2021-06-17
          • 2020-07-14
          • 2019-07-15
          • 1970-01-01
          • 1970-01-01
          • 2019-05-04
          • 2021-09-25
          相关资源
          最近更新 更多