Heroku上的Django无法使用不同的架构连接到Postgres

时间:2018-07-19 21:41:33

标签: django postgresql heroku schema

我今天致力于将应用程序从本地环境迁移到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>'

2 个答案:

答案 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>