我今天致力于将应用程序从本地环境迁移到Heroku。同时令人沮丧和有趣,但现在我很困。
我有一个名为DCPViews
的模式,我希望在运行查询时将数据库连接默认为默认模式。我已经阅读了所有相关的教程/帖子/技巧,这就是我的位置:
数据库层次结构
postgres (default system database)
-> DCP (app database)
-> DCP (base tables schema)
-> DCPViews (views layer schema)
settings.py
import django_heroku
import dj_database_url
...
DATABASES = {}
# DATABASE_URL = 'postgres://<user>:<pass>@<host>:<port>/<db_name>?currentSchema=<schema>'
DATABASE_URL = 'postgres://' + \
config('DB_USER') + ':' + \
config('DB_PASSWORD') + '@' + \
config('DB_HOST') + ':' + \
config('DB_PORT') + '/' + \
config('DB_NAME') + \
'?currentSchema=' + config('DB_SCHEMA_NAME')
DATABASES['default'] = dj_database_url.config(default=DATABASE_URL, ssl_require=True)
...
# Configure Django App for Heroku
django_heroku.settings(locals())
我已经尽一切努力使Heroku使用正确的DATABASE_URL(带有currentSchema
= DCPViews
),但是没有运气。我没有数据库权限来创建新角色,也没有为Heroku的默认数据库用户设置搜索路径。它还不允许我手动导出DATABASE_URL
,并且似乎不接受我在settings.py
文件中传递的值。 heroku config -s
命令始终返回相同的DATABASE_URL
值。
在我的本地环境中一切正常,但这是一个主要障碍。运行查询时,如何让Heroku使用正确的search_path
或默认为DCPViews
模式?
我要发送要在currentSchema
文件中使用的数据库凭证和settings.py
,但是Heroku似乎忽略了它们,并在创建DATABASES['default']
密钥时覆盖了它们。当我在浏览器中加载页面时,这是Django调试:
DATABASES
{'default': {'ATOMIC_REQUESTS': False,
'AUTOCOMMIT': True,
'CONN_MAX_AGE': 600,
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'HOST': '<host_name>',
'NAME': '<db_name>',
'OPTIONS': {'sslmode': 'require'},
'PASSWORD': '********************',
'PORT': 5432,
'TEST': {'CHARSET': None,
'COLLATION': None,
'MIRROR': None,
'NAME': None},
'TIME_ZONE': None,
'USER': '<user_name>'}}
DATABASE_URL
'postgres://<user>:<pass>@<host>:<port>/<db_name>?currentSchema=<schema>'
答案 0 :(得分:1)
我无法发表评论,但是由于您的设置文件正在使用环境文件,因此您只能转到heroku.com
中的heroku应用程序,然后转到与应用程序连接的数据库。然后转到设置并单击reveal config vars
。将DATABASE_URL
更改为您需要的任何值(请注意,它可能只是您实际的heroku postgres数据库URL的扩展)
答案 1 :(得分:0)
好吧,我走的路正确。我将search_path
添加到了角色中,就达到了效果:
ALTER ROLE <role_name> SET search_path = <go, pirates>