Heroku 的数据库连接错误:将 Web 应用程序连接到 Postgresql

Database connection error at Heroku: connect web app to Postgresql

我正在尝试在 heroku 中部署一个用 fastapi 编写的应用程序并将其连接到数据库。 为此,我将 heroku-postgres (hobbi-dev) 添加到创建的项目中,然后在我的 Web 应用程序代码中使用数据库凭据。

DATABASE_URL = "postgresql://qpvnasuzcvdwee:d3aecc71083e8f279851285095d9a8cb33f470c5838badaedc5ff1e3ce2df9c5@localhost:5432/detdicolajotpa"

# SQLAlchemy
engine = create_engine(DATABASE_URL)
metadata = MetaData()

# databases query builder
database = Database(DATABASE_URL)

但在日志控制台我得到

2020-07-14T09:51:16.906646+00:00 heroku[web.1]: Starting process with command `gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app`
2020-07-14T09:51:19.630398+00:00 app[web.1]: [2020-07-14 09:51:19 +0000] [4] [INFO] Starting gunicorn 20.0.4
2020-07-14T09:51:19.631018+00:00 app[web.1]: [2020-07-14 09:51:19 +0000] [4] [INFO] Listening at: http://0.0.0.0:8499 (4)
2020-07-14T09:51:19.631118+00:00 app[web.1]: [2020-07-14 09:51:19 +0000] [4] [INFO] Using worker: uvicorn.workers.UvicornWorker
2020-07-14T09:51:19.636402+00:00 app[web.1]: [2020-07-14 09:51:19 +0000] [10] [INFO] Booting worker with pid: 10
2020-07-14T09:51:19.645490+00:00 app[web.1]: [2020-07-14 09:51:19 +0000] [11] [INFO] Booting worker with pid: 11
2020-07-14T09:51:19.707669+00:00 app[web.1]: [2020-07-14 09:51:19 +0000] [12] [INFO] Booting worker with pid: 12
2020-07-14T09:51:19.759618+00:00 app[web.1]: [2020-07-14 09:51:19 +0000] [15] [INFO] Booting worker with pid: 15
2020-07-14T09:51:20.176702+00:00 heroku[web.1]: State changed from starting to up
2020-07-14T09:51:22.153843+00:00 app[web.1]: [2020-07-14 09:51:22 +0000] [12] [ERROR] Exception in worker process
2020-07-14T09:51:22.153882+00:00 app[web.1]: Traceback (most recent call last):
2020-07-14T09:51:22.153884+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2339, in _wrap_pool_connect
2020-07-14T09:51:22.153885+00:00 app[web.1]:     return fn()
2020-07-14T09:51:22.153886+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 364, in connect
2020-07-14T09:51:22.153887+00:00 app[web.1]:     return _ConnectionFairy._checkout(self)
2020-07-14T09:51:22.153887+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 778, in _checkout
2020-07-14T09:51:22.153887+00:00 app[web.1]:     fairy = _ConnectionRecord.checkout(pool)
2020-07-14T09:51:22.153888+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 495, in checkout
2020-07-14T09:51:22.153889+00:00 app[web.1]:     rec = pool._do_get()
2020-07-14T09:51:22.153889+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/pool/impl.py", line 140, in _do_get
2020-07-14T09:51:22.153890+00:00 app[web.1]:     self._dec_overflow()
2020-07-14T09:51:22.153890+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 69, in __exit__
2020-07-14T09:51:22.153890+00:00 app[web.1]:     exc_value, with_traceback=exc_tb,
2020-07-14T09:51:22.153891+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 178, in raise_
2020-07-14T09:51:22.153891+00:00 app[web.1]:     raise exception
2020-07-14T09:51:22.153891+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/pool/impl.py", line 137, in _do_get
2020-07-14T09:51:22.153891+00:00 app[web.1]:     return self._create_connection()
2020-07-14T09:51:22.153892+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 309, in _create_connection
2020-07-14T09:51:22.153892+00:00 app[web.1]:     return _ConnectionRecord(self)
2020-07-14T09:51:22.153892+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 440, in __init__
2020-07-14T09:51:22.153893+00:00 app[web.1]:     self.__connect(first_connect_check=True)
2020-07-14T09:51:22.153893+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 661, in __connect
2020-07-14T09:51:22.153895+00:00 app[web.1]:     pool.logger.debug("Error on connect(): %s", e)
2020-07-14T09:51:22.153895+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 69, in __exit__
2020-07-14T09:51:22.153895+00:00 app[web.1]:     exc_value, with_traceback=exc_tb,
2020-07-14T09:51:22.153895+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 178, in raise_
2020-07-14T09:51:22.153896+00:00 app[web.1]:     raise exception
2020-07-14T09:51:22.153896+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 656, in __connect
2020-07-14T09:51:22.153896+00:00 app[web.1]:     connection = pool._invoke_creator(self)
2020-07-14T09:51:22.153897+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
2020-07-14T09:51:22.153897+00:00 app[web.1]:     return dialect.connect(*cargs, **cparams)
2020-07-14T09:51:22.153897+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 493, in connect
2020-07-14T09:51:22.153898+00:00 app[web.1]:     return self.dbapi.connect(*cargs, **cparams)
2020-07-14T09:51:22.153898+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/psycopg2/__init__.py", line 127, in connect
2020-07-14T09:51:22.153898+00:00 app[web.1]:     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
2020-07-14T09:51:22.153899+00:00 app[web.1]: psycopg2.OperationalError: could not connect to server: Connection refused
2020-07-14T09:51:22.153899+00:00 app[web.1]:    Is the server running on host "localhost" (127.0.0.1) and accepting
2020-07-14T09:51:22.153899+00:00 app[web.1]:    TCP/IP connections on port 5432?

据我了解,此字符串 psycopg2.OperationalError: could not connect to server: Connection refused 报告了与基地的连接问题。 你能告诉我我做错了什么吗?在具有类似设置的本地计算机上,一切正常。

如果您使用的是 psycopg2,则需要安装 psycopg2-binary for Heroku

要获取连接参数os.environ,不要尝试直接连接,这是Heroku推荐的解决方案来自Heroku Postgres

DATABASE_URL = os.environ.get('DATABASE_URL')

您不应该将凭据放入您的代码中,它们已被泄露,请确保在通过 Heroku 控制台使用 heroku pg:credentials --reset 部署您的应用程序之前重置它们。