代码之家  ›  专栏  ›  技术社区  ›  ravioli

heroku上的django无法连接到具有不同架构的postgres

  •  0
  • ravioli  · 技术社区  · 7 年前

    我今天致力于将我的应用程序从本地环境迁移到Heroku。这是令人沮丧和有趣的同时,但现在我很困。

    我有一个名为 DCPViews 我希望在运行查询时将数据库连接默认为我已经阅读了所有相关的教程/帖子/提示,以下是我的位置:

    数据库层次结构

    postgres (default system database) 
      -> DCP (app database) 
        -> DCP (base tables schema) 
        -> DCPViews (views layer schema) 
    

    设置.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使用正确的数据库URL(与 currentSchema = DCP视图 ),但没有运气。我没有创建新角色的db权限,也没有为heroku的默认db用户设置搜索路径。它也不让我出口 DATABASE_URL 手动操作,似乎不接受我传入的值 settings.py 文件。这个 heroku config -s 命令总是返回相同的 数据库URL 价值。

    在我当地的环境下一切都很好,但这是一个主要的障碍。我怎样才能让Heroku使用正确的 search_path 或默认为 DCP视图 运行查询时的架构?

    更新

    我将发送数据库凭据和 当前架构 我想用在我的 设置.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 回复  |  直到 7 年前
        1
  •  1
  •   Oh Great One    7 年前

    我还不能发表评论,但是由于你的设置文件正在使用一个环境文件,你可以在 heroku.com 然后转到连接到应用程序的数据库然后转到“设置”并单击 reveal config vars 是的。改变你的 DATABASE_URL 不管你需要什么(请注意,它可能只是实际heroku postgres数据库url的一个扩展)

        2
  •  0
  •   ravioli    7 年前

    嗯,我走对了路我添加了 search_path 对这个角色来说,这就是诀窍:

    ALTER ROLE <role_name> SET search_path = <go, pirates>