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



我遵循了文档,并在我的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')

我从会话配置变量中获取的URL(我使用:heroku pg:credentials:url)。

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

但部署后显示以下错误:

创建会话失败:"postgres://sficoXXX: 842 yyy@ec2 - 54 - 165 - 184 - 219. -计算- 1.——amazonaws.com: 5432/数据库名"回溯(最近一次调用):文件"/用户/spoleto/.pyenv/版本/3.8.13/lib/python3.8/网站/otree/session.py",在create_session_traceback_wrapper中,第447行return create_session(**kwargs) File "/Users/spoleto/.pyenv/versions/3.8.13/lib/python3.8/site-packages/otree/session.py"第418行,在create_sessionfunc(子会话)文件"/Users/spoleto/PycharmProjects/upstream-reciprocity/prototypes/Consent/init.py"第35行,在creating_sessionDATABASE_URL = os.environ[postgres://sficoXXX:842YYY@ec2-54-165-184-219.compute-1.amazonaws.com:5432/database-name']文件"/Users/spoleto/.pyenv/versions/3.8.13/lib/python3.8/os.py&quot在中获取itemraise KeyError(key) from None

我这样做对吗?错误从何而来?这种联系应该如何建立?

这几乎是对文档的复制/粘贴。

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

与其手动查找DATABASE_URL的值并将其粘贴到源代码中,不如使用名称环境变量:

DATABASE_URL = os.environ['DATABASE_URL']
现在,您的代码将在每次运行时动态地查找具有该名称的环境变量,并将DATABASE_URL变量设置为DATABASE_URL

环境变量的值。(您在问题中显示的代码查找名为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"

注意:你没有泄漏你的整个连接字符串在你的问题,但我建议你旋转你的凭据:

heroku pg:credentials:rotate

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

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

最新更新