如何从 Python 连接到 Heroku 中的 postgres?

How to connect to posgres in Heroku from Python?

我遵循了 documentation 并在我的 Python 代码中添加了:

import os
import psycopg2

DATABASE_URL = os.environ['postgres://sficoXXX:842YYY@ec2-54-165-184-219.compute-1.amazonaws.com:5432/database-name']

conn = psycopg2.connect(DATABASE_URL, sslmode='require')

我从会话Config Vars中获取的URL(我使用的是:heroku pg:credentials:url)。

当我使用 heroku pg:psql 检查与数据库的连接时,一切似乎都工作正常。

但是部署后出现如下错误:

Failed to create session: 'postgres://sficoXXX:842YYY@ec2-54-165-184-219.compute-1.amazonaws.com:5432/database-name' Traceback (most recent call last): File "/Users/spoleto/.pyenv/versions/3.8.13/lib/python3.8/site-packages/otree/session.py", line 447, in create_session_traceback_wrapper return create_session(**kwargs) File "/Users/spoleto/.pyenv/versions/3.8.13/lib/python3.8/site-packages/otree/session.py", line 418, in create_session func(subsession) File "/Users/spoleto/PycharmProjects/upstream-reciprocity/prototypes/Consent/init.py", line 35, in creating_session DATABASE_URL = os.environ[postgres://sficoXXX:842YYY@ec2-54-165-184-219.compute-1.amazonaws.com:5432/database-name'] File "/Users/spoleto/.pyenv/versions/3.8.13/lib/python3.8/os.py", line 675, in getitem raise KeyError(key) from None

我这样做对吗?错误从何而来?应该如何建立连接?

这几乎是文档中的 copy/paste。

将连接字符串放入环境变量的全部意义在于它不需要在您的源代码中。

不要手动查找 DATABASE_URL 的值并将其粘贴到您的源代码中,而是使用环境变量的 name

DATABASE_URL = os.environ['DATABASE_URL']

现在你的代码将在每次运行时动态寻找一个具有该名称的环境变量,并将你的DATABASE_URL变量设置为[=14]的值=]环境变量。

(您在问题中显示的代码查找名为 postgres://... 的环境变量,该变量不太可能存在。)

请注意,如果找不到名为 DATABASE_URL 的环境变量,这将失败并显示 IndexError。一种更安全的方法可能是使用 .get() 方法(确保使用圆括号而不是方括号):

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

现在您甚至可以提供后备方案,例如对于本地开发:

DATABASE_URL = os.environ.get('DATABASE_URL') or "postgres://postgres:postgres@localhost:5432/postgres"

注意:您并没有在问题中泄露整个连接字符串,但我还是建议您rotate your credentials

heroku pg:credentials:rotate

这将使旧的连接字符串失效并生成一个新的。

好消息是您的 DATABASE_URL 环境变量将自动更新,并且由于您的代码现在在运行时读取该值,它将继续工作!