如何更改 Heroku 应用程序的 DATABASE_URL

Posted

技术标签:

【中文标题】如何更改 Heroku 应用程序的 DATABASE_URL【英文标题】:How to change DATABASE_URL for a heroku application 【发布时间】:2016-05-05 20:29:29 【问题描述】:

我想在我的 heroku 应用程序中使用外部数据库。但我无法编辑配置部件。我尝试使用 GUI,它说,不能覆盖附件值 DATABASE_URL。虽然我也尝试使用 CLI。我使用了命令:heroku config:addDATABASE_URL="postgresql://username:password@IP:PORT"。但是,这会引发错误... is not a heroku command.

【问题讨论】:

我的错,编辑过程中的错字。顺便说一句,命令中有一个“=”,但它不起作用 请发布错误消息的完整输出。 heroku config:add VAR="VAL" 肯定可以工作。 设置配置变量并重新启动 app-name... 完成 VAR: VAL 我的意思是你的错误信息,不要尝试我的例子,这只是为了展示语法应该是什么样子。无论如何,Heroku 文档位于 devcenter.heroku.com/articles/config-vars 【参考方案1】:

在尝试了大多数这些答案之后,我在 2016 年遇到了一个更新,here: 需要先分离数据库,然后更新DATABASE_URL的变量。

heroku addons:attach heroku-postgresql -a <app_name> --as HEROKU_DATABASE
heroku addons:detach DATABASE -a <app_name>
heroku config:add DATABASE_URL=

【讨论】:

+1 必须在设置 DATABASE_URL 之前分离当前数据库。从 Heroku Postgres 迁移到 AWS 上的 RDS 时这样做。 我遇到了错误“无法销毁最后一个附件到计费应用程序的资源”,并且必须在分离之前销毁我的 Heroku 数据库(请参阅:***.com/questions/30611801/…)。从好的方面来说,您可以创建一个新的 Heroku 数据库,按照下面列出的方式对其进行升级,然后将其销毁以释放此保留。之后,您可以使用 config:add 或 config:set 设置外部 URL(例如 RDS)。【参考方案2】:

另一种不需要分离的替代方法(这可能不是切换的预期结果)是简单地附加新数据库然后升级它,Heroku Documents 明确指出这是设置@987654322 的一种方式@。

heroku addons:attach heroku-postgresql -a <app_name>
heroku pg:promote heroku-postgresql -a <app_name>

【讨论】:

我不得不使用这个版本而不是分离然后添加配置。 这对我有用。请注意,您需要将heroku-postgresql 替换为您要附加到的新数据库的名称。这可以在 Heroku Postgres 下的应用概览页面上找到。【参考方案3】:

作为explained in this article,设置/添加配置变量的正确语法是

$ heroku config:set DATABASE_URL="postgresql://username:password@IP:PORT"

但是,看起来(参见 cmets)DATABASE_URL 已被弃用,尝试更新它会触发错误。

【讨论】:

嘿,给我一个错误无法覆盖附件值DATABASE_URL。 Heroku 贬低了更新 database_url 是一些 *** 帖子所说的。 谢谢。我已经更新了答案,以防其他人偶然发现这个帖子。 谢谢。我添加了一个对我有用的解决方法的答案。欢迎分享。【参考方案4】:

我今天遇到了同样的情况,我需要将postgres 更改为postgis。分离对我不起作用,所以我对 database.yml 进行了此操作:

production:

  url: <%= ENV['DATABASE_URL'].sub(/^postgres/, "postgis") %>

https://github.com/rgeo/activerecord-postgis-adapter/issues/214.

【讨论】:

【参考方案5】:

解决了。仅供有相同问题或希望有类似实现的用户参考。这是对我有用的解决方法。

Heroku 不再覆盖 databse.yml,所以我只是修改了 database.yml 中的 DATBASE_URL 并推送它:)

它也成功了!

来源:https://discussion.heroku.com/t/rails-4-1-database-yml-no-longer-overwritten-on-heroku/550

【讨论】:

链接失效了,能给我们举个database.yml的例子吗? 去heroku仪表板>数据库>删除数据库;回到 config/database.yml 输入数据库的详细信息。像这样gist.github.com/pbssubhash/705dfb538aea75ee9ab3 但是,不建议对值进行硬编码,直到我们找到更好的值,你可以按照这个。如果您仍有问题,请在此处评论,我很乐意为您提供帮助 @jcstritt 所以你将你的 database.yml 推送到源代码管理中? 是的@AnthonyTo。我做到了。 您总是可以将实际的 url 放入环境变量中,然后使用 figaro gem 之类的东西推送到 Heroku。【参考方案6】:

基于Heroku docs,这是您与多个应用共享数据库的方式。

heroku addons:attach my-originating-app::DATABASE --app sushi

【讨论】:

【参考方案7】:

SQLAlchemy 1.4.x 已删除对 Heroku Postgres (https://github.com/sqlalchemy/sqlalchemy/issues/6083) 使用的 postgres:// URI 方案的支持。为了保持兼容性,请在设置与 SQLAlchemy 的连接之前执行以下操作:

import os
import re

uri = os.getenv("DATABASE_URL")  # or other relevant config var
if uri.startswith("postgres://"):
    uri = uri.replace("postgres://", "postgresql://", 1)
# rest of connection code using the connection string `uri`

这将允许您使用 SQLAlchemy >= 1.4.x 连接到 Heroku Postgres 服务

【讨论】:

这个问题是专门针对 Ruby 的,所以 Python 的答案没有用。【参考方案8】:

就我而言,我需要使用我的个人数据库 (postgres) 启动一个 java spring boot 应用程序。我在 AWS 上有一个实例,在加载应用程序时发生错误,因为它会在没有 ssl 的情况下连接。

考虑到这个文档 (https://devcenter.heroku.com/articles/connecting-to-relational-databases-on-heroku-with-java#using-ssl-with-postgresql),它说:

我们曾经建议将 URL 参数 sslmode=disable 添加到 JDBC URL。我们现在要求对所有新的 Heroku Postgres 数据库使用 SSL。从 2018 年 3 月起,我们将在所有 Heroku Postgres 数据库上强制使用 SSL。请不要为您的数据库禁用 SSL,否则您的应用程序可能会中断。

所以,继续第 1 步,我删除了资源选项卡上的插件 Heroku Postgres。 第 2 步,我更改了我的 application.yml 来自:

datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://<url>:<port>/<dataBaseName>?createDatabaseIfNotExist=true&useSSL=false
    username: <user>
    password: <pass>

datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://<url>:<port>/<dataBaseName>?createDatabaseIfNotExist=true&useSSL=false&sslmode=disable
    username: <user>
    password: <pass>

我在 url 字符串的末尾添加了“&sslmode=disable”。

最后,重建/部署(在我的情况下,这是在推入我在 github 上的 repo 后自动执行的)。

我希望这会对某人有所帮助。

和平...

【讨论】:

【参考方案9】:

编辑DATABASE_URL 的一种方法是创建另一个应用程序并在那里添加heroku_postgres 附加组件,然后获取该数据库的 url 并通过配置环境变量在主应用程序中使用它并设置DATABASE_URL 的值到数据库的那个 url。

现在您可以轻松更改DATABASE_URL,因为它未与应用程序关联。

【讨论】:

以上是关于如何更改 Heroku 应用程序的 DATABASE_URL的主要内容,如果未能解决你的问题,请参考以下文章

Django Heroku 如何返回开发服务器进行更多更改

从 github 部署更改的模型时,如何在 heroku 上运行 makemigrations/migrate?

无需更改代码即可重新部署 Heroku 应用

安装依赖项后如何清理heroku中的缓存?

Heroku Postgres 升级后 Flyway 无法连接到数据库

如何更改 Heroku 中的列类型?