【问题标题】:Heroku App can Interact with Heroku-postgres locally, but not When Deployed to HerokuHeroku App 可以在本地与 Heroku-postgres 交互,但在部署到 Heroku 时不能
【发布时间】:2021-08-09 02:39:30
【问题描述】:

我正在为我在 Heroku 上托管的一个非常简单的游戏制作一个 Flask 应用程序,它与 Heroku-Postgres “hobby-dev”级别的数据库进行交互。在本地托管时,该应用程序可以与数据库完美交互(。但是,当我将其部署在 Heroku 上时,它通常会在尝试与数据库交互后不久崩溃。不需要此交互的页面可以正常工作。特别是,我在 Heroku 的日志中收到以下两个错误:

2021-05-19T19:23:20.943811+00:00 app[web.1]:cur = db.cursor() 
2021-05-19T19:23:20.943812+00:00 app[web.1]: psycopg2.InterfaceError: connection already closed

还有……

2021-05-19T19:20:35.682211+00:00 app[web.1]:     cur.execute("select * from mock_table;")
2021-05-19T19:20:35.682211+00:00 app[web.1]: psycopg2.OperationalError: SSL error: decryption failed or bad record mac

我有一些基于研究的理论,但我不确定:

  • 数据库连接仅在 Flask 应用程序的最开始创建一次。
  • 我将用于与数据库交互的 Python 代码存储在一个单独的模块中。我在 Flask 应用程序模块中使用 psycopg2.connect(...) 进行原始连接一次,但我将其传递给另一个模块及其方法以实际与数据库交互。
  • 其他原因导致数据库连接结束

这些是否接近,有人明白我错过了什么吗?如果需要,我可以提供更多信息,但我不想提供太多信息。

【问题讨论】:

    标签: python flask heroku heroku-postgres


    【解决方案1】:

    根据this article,我收到错误的一个可能原因是数据库连接超时。因此,我所要做的就是将我的数据库调用方法放在一个 try-except 块中,并在发生错误时重新建立连接。例如,

    cur.execute("select * from mock_table;")
    

    可以替换为...

    try:
        cur.execute("select * from mock_table;")
    except:
        #remake connection here
        db.connect(host=host, database=database, user=user, password=password)
        cur.execute("select * from mock_table;")
    

    这不是最优雅的解决方案,它可能存在一些缺陷,但到目前为止它已经成功解决了这个问题,所以我想我会分享它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-11
      • 2020-01-09
      • 1970-01-01
      • 2016-12-05
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多