【问题标题】:Django on Heroku can't connect to Postgres with different schemaHeroku 上的 Django 无法连接到具有不同架构的 Postgres
【发布时间】:2018-12-28 03:37:36
【问题描述】:

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

【问题讨论】:

    标签: django postgresql heroku schema


    【解决方案1】:

    我还不能发表评论,但由于您的设置文件正在使用环境文件,您可以直接转到 heroku.com 中的 heroku 应用程序,然后转到连接到您的应用程序的数据库。然后转到设置并单击reveal config vars。将您的 DATABASE_URL 更改为您需要的任何内容(请注意,它可能只是您实际 heroku postgres 数据库 url 的扩展)

    【讨论】:

    • 感谢您的提示。我试过了,它不会让我更改 DATABASE_URL 值。 Heroku 文档说无论如何它都会定期更新 DATABASE_URL 值,所以我还必须每次都更改它。
    • 啊,没错。它确实更新了,所以你不能这样做。您当前的计划是免费计划吗?
    • 是的,这是免费的。
    • 啊,好吧。好吧,如果将其升级到第一层可以解决您的问题,那将是非常理想的。我正在使用 django/postgres 在该级别上运行一个多租户应用程序,它非常便宜。编辑:升级以利用数据库搜索路径。
    • @OhGreatOne 你的答案看起来很棒。请您告诉我们运行多租户 con Heroku 的正确设置吗?我不能那样做。运行 migrate_schemas --shared 时,我收到一条消息:“AttributeError: 'DatabaseWrapper' 对象没有属性 'set_schema”。非常感谢您的帮助。
    【解决方案2】:

    嗯,我是在正确的道路上。我将 search_path 添加到 ROLE 中,就成功了:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 2010-12-22
      • 2020-09-16
      • 2018-07-13
      相关资源
      最近更新 更多