【问题标题】:Running two databases on heroku with django使用 django 在 heroku 上运行两个数据库
【发布时间】:2018-06-21 05:51:56
【问题描述】:

我的 Django 应用程序需要访问两个数据库。一个是由一个单独的应用程序拥有的共享数据库,Django 应用程序只有读取权限。第二个完全归 Django 应用所有。

对于本地开发我没问题,但我不确定如何配置以使 Heroku 使用第二个数据库。

目前我将共享数据库提升为DATABASE_URL,辅助数据库位于HEROKU_POSTGRESQL_BLUE_URL

在我的设置中:

DATABASES = {  
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'main_database_name',
        'USER': 'username',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432',
    }, 'secondary': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME':  'secondary_database_name',                  
        'USER': 'username',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432',
    } 
}

如果您需要我澄清,请提出更多问题。

谢谢!

总之,我的具体问题是:我不知道如何让 Heroku 使用 HEROKU_POSTGRESQL_BLUE_URL 作为“辅助”数据库。

---编辑----

settings.py的底部:

# Configure Django App for Heroku.
import django_heroku
django_heroku.settings(locals())

这是在我的应用程序的默认数据库和 Heroku 的 DATABASE_URL 之间建立连接的地方。我仍然没有解决这个问题,但是在 cmets 的一些故障排除帮助之后,我相信答案会在那里找到。

【问题讨论】:

  • 您是否尝试了不起作用的配置?您遇到的具体问题是什么?
  • @Blurp 这是我当前的设置,但我还没有部署它。我不确定如何告诉 heroku 使用 HEROKU_POSTGRESQL_BLUE_URL 作为我的辅助数据库。
  • 那么,您如何告诉它使用 DATABASE_URL 作为主数据库?这从您显示的代码中并不明显。
  • @DanielRoseman 正确。 :) 我不确定 Heroku 上是如何发生的。但我可以确认默认数据库正在使用 heroku 上的 DATABASE_URL。我假设由于“默认”数据库名称是 Django 上保留的特殊名称,并且 DATABASE_URL 始终是 heroku 上主数据库的名称,因此除非另有说明,否则两者会自动连接。可能在 django-heroku buildpack 中。
  • 没有。这不是自动的。您的设置文件中必须有一些引用 DATABASE_URL 的内容;你应该展示它。

标签: python django postgresql heroku multiple-databases


【解决方案1】:

这是我的工作解决方案。

我有一个没有被版本控制跟踪的local_settings.py 文件。这包含开发人员的 postgres 实例的数据库设置。

local_settings.py

DATABASES = {  
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'main_database_name',
        'USER': 'username',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432',
    }, 'secondary': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME':  'secondary_database_name',
        'USER': 'username',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

然后在settings.py 我尝试导入local_settings.py 文件。如果它不存在,我使用 django_heroku 包为 Heroku 配置所有内容。在我的例子中,我需要传递关键字参数databases=False,因为我想对数据库进行更自定义的配置。

settings.py(仅相关部分)

# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
# These database settings are used for heroku deployments. They are overwritten with local_settings.py in development.
DATABASES = {  
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('DATABASE_URL'),
        'USER': '',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432',
    }, 'secondary': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('SECONDARY_DATABASE_URL'),
        'USER': '',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}


try:
    from local_settings import *
except ImportError as e:
    # Configure Django App for Heroku.
    import django_heroku
    django_heroku.settings(locals(), databases=False)

为了让它工作,你需要将 Heroku 环境变量 SECONDARY_DATABASE_NAME 设置为你的数据库的 url。

要查找辅助数据库的 URL,请运行 heroku config -a your_app_name。复制 url,然后通过运行在 heroku 中设置一个新的环境参数

heroku config:set SECONDARY_DATABASE_URL=postgres://xxxxxxx -a your_app_Name

关于如何处理 ENV 变量有很多选择,我喜欢这个,因为我可以在我的暂存和生产环境中设置它,并且相同的设置适用于两者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2015-03-02
    • 2012-02-14
    相关资源
    最近更新 更多