在Heroku中的2个应用程序之间共享数据库


89

我想从另一个Heroku应用程序访问一个应用程序的数据库。在共享数据库中有可能吗?

Answers:


100

更新

最初,此答案表明,尽管可以通过一些技巧来实现,但强烈建议不要这样做。这是基于Heroku开发人员支持网站上的建议。但是,Heroku最近发布了一封通信,专门描述了如何实现此目标,并在开发者网站上淡化了他们的建议。他们的电子邮件中此部分的全文如下:

您是否知道Heroku应用可以共享一个公共数据库?例如,您可以将分析功能与面向用户的代码放在单独的应用程序中。

只需将多个应用程序的DATABASE_URL配置变量设置为相同的值即可。首先,获取您现有应用程序的DATABASE_URL:

$ heroku config | grep DATABASE_URL  --app sushi DATABASE_URL => postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute1.amazonaws.com/ldfoiusfsf

然后,将新应用程序的DATABASE_URL设置为此值:

$ heroku config:add DATABASE_URL=postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute-1.amazonaws.com/ldfoiusfsf --app sushi-analytics
Adding config vars: DATABASE_URL => postgres://lswlm...m/ldfoiusfsf Restarting app... done, v74. That's it

-现在两个应用程序将共享一个数据库。

作为参考,Heroku最初的建议是创建并使用API​​远程访问数据。我个人的观点是,总的来说,在很多情况下,这是一个很好的建议(即,比仅将多个应用程序连接到同一个DB更好),尽管我看到的情况会带来更多的麻烦,而不是值得的。

更新

根据对此答案的评论,值得注意的是,Heroku保留根据需要更改数据库URL的权利。如果发生这种情况,将导致您的辅助连接失败,并且您需要相应地更新URL。


1
只需在Heroku上设置应用程序即可证明这是可能的-我的回复中有详细信息。
约翰·贝农

1
足够公平,拒绝投票已撤消... Heroku支持给出了不同的答案!问题:如果我开发两个heroku应用程序,它们可以访问一个数据库吗?我问的原因是我们有一个Rails应用程序和一个sinatra应用程序,它们需要共享一个postgres数据库。宁愿不通过http来做到这一点!来自heroku支持的答案:是的,如果需要,可以。每个Heroku应用程序默认情况下都会获取一个已配置的数据库,但是一个应用程序可以通过将DATABASE_URL配置变量从一个应用程序复制到另一个应用程序来使用另一个应用程序的数据库。
约翰·贝农

1
我撤回了否决票,但接受的答案仍然像FYI一样不正确。
约翰·贝农

1
他们确实说他们保留更改您的应用程序数据库URL的权利,因此,如果发生这种情况,则需要更改您手动使用的数据库URL。
约翰·贝农

7
现在有一种正式的heroku方式可以在应用之间共享DATABASE_URL。请参阅下面 @ c360ian的答案。
mobeets 2015年

81

有关问题的最新答案!

Heroku现在通过其插件框架正式支持更好/优美的解决方案。最新的新闻通讯中介绍了如何在应用之间共享插件。以下是本文中提到的摘录:

$ heroku addons:attach my-sushi-db -a my-sushi-reporting --as MAIN_SUSHI_DB    
  Adding MAIN_SUSHI_DB to my-sushi-reporting... done
  Setting MAIN_SUSHI_DB vars and restarting my-sushi-app-reporting... done, v3

链接:expanding_the_power_of_add_ons


非常感谢!,这应该是优先解决的问题!
HLL 2015年

2
这是正确的答案。所有其他答案均已弃用,无论如何,大多数答案都是重复的。
jelder

3
我使用的命令格式为heroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Marklar,2016年

15

据我所知-您必须使用DB查看您的应用程序的heroku配置变量,然后将要共享数据库的应用程序上的database_url设置为相同的值。不过,我不知道Kinda是否偏离轨道以及它如何得到支持。

编辑为了让我休息,我在Heroku上启动了两个应用程序-一个带有标题的简单脚手架“发布”。

http://evening-spring-734.heroku.com/posts是大师

http://electric-galaxy-230.heroku.com/posts-是奴隶

因此,在其中任何一个上创建的帖子都将被写到Evening-spring-734的数据库URL中。

我所做的只是使用heroku config获取spring-spring-734的DATABASE_URL,然后将相同的值设置到electric-galaxy-230的DATABASE_URL中。

您可能最终会遇到一些富有成效的数据库争用条件,但是绝对可以做到。

魔术吧?


+1:我认为这对于处理简短或虚构网址非常有用。例如myapp.me/iwasrobbed(Heroku App#1)重定向到myapp.com/users/1(Heroku App#2),因为现在我可以存储标准用户数据库中的虚荣名称。谢谢约翰!
iwasrobbed

1
heroku pg:promote DATABASE_URL --app your_app_name是设置此变量的受支持方式。
尼尔·米德尔顿

我唯一的评论是关于种族的情况。工人和Web实例将是相同的,远程工人如钢铁工人或重新安置也将是相同的。
baash05

12

我最近在Heroku时事通讯中收到了此邮件。我正在通过电子邮件发送给他们,以查看是否确实是批准的用法。

你知道吗?

与许多应用程序共享一个数据库

您是否知道Heroku应用可以共享一个公共数据库?例如,您可以将分析功能与面向用户的代码放在单独的应用程序中。

只需将多个应用程序的DATABASE_URL config var设置为相同的值即可。首先,DATABASE_URL为您现有的应用获取:

$ heroku config | grep DATABASE_URL  --app sushi
DATABASE_URL   => postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute-1.amazonaws.com/ldfoiusfsf

然后,将DATABASE_URL新应用的设置为此值:

$ heroku config:add DATABASE_URL=postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute-1.amazonaws.com/ldfoiusfsf --app sushi-analytics
Adding config vars: DATABASE_URL => postgres://lswlm...m/ldfoiusfsf
Restarting app... done, v74.

就是这样-现在两个应用程序将共享一个数据库。


4
我问Heroku关于使用这种方法同时获得免费的Web dyno和免费的Worker dyno。这是他们的回应。>>“乔什-我们不鼓励这样做,但除此之外,还会有工人闲置的问题。一旦闲置,它将停止做任何工作,并且没有什么可以像网络请求那样“唤醒”它的看来您可以在同一个数据库上使用多个应用程序,但是免费使用它并不是很有用。
JoshRivers

我将其用于开发目的,我的实时应用程序中已经有成千上万的行,并且在另一个较小的heroku应用程序中正在开发新的外观,因此能够共享数据非常酷,我可以开发并查看新外观。相同的数据
Dvid Silva

7

Amazon RDS插件对此非常有效。多个应用可以共享同一个RDS实例。

您可以使用active_record.table_name_prefix灵活地让它们共享表或避免表名冲突。


1

参见Heroku参考:https : //devcenter.heroku.com/categories/heroku-postgres

问:多个Heroku应用程序可以连接到单个数据库吗?

是。您可以将Heroku上运行的多个应用程序配置为连接到单个数据库,只要您具有数据库凭据即可。只需使用heroku config:add DATABASE_URL = ...命令覆盖要连接的应用程序的DATABASE_URL。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.