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

don*_*ald 87 heroku ruby-on-rails-3

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

Pau*_*ell 98

更新

最初,这个答案指出虽然这可以用一些技巧,但强烈劝阻.这是基于Heroku开发人员支持网站上的建议.然而,最近Heroku发布了专门描述如何实现这一目标的通信,并在开发者网站上淡化了他们的建议.他们的电子邮件的这一部分的完整文本包括在下面:

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

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

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

然后,将新应用的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
Run Code Online (Sandbox Code Playgroud)

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

作为参考,Heroku最初的建议是创建和使用API​​远程访问数据.我个人的观点是,总的来说,对于很多情况来说这是一个很好的建议(即,不仅仅是将多个应用程序连接到同一个数据库),尽管我可以看到那些比它更值得麻烦的情况.

UPDATE

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

  • 现在有一个官方的heroku方式来共享应用程序之间的DATABASE_URL.请参阅@ c360ian [下方](http://stackoverflow.com/a/28249767/1363024)的答案. (6认同)
  • 公平地说,反对票被撤回……Heroku 支持给出了不同的答案!问题:如果我开发两个 Heroku 应用程序,它们可以访问单个数据库吗?我问的原因是我们有一个 Rails 应用程序和一个 sinatra 应用程序,它们需要共享一个 postgres 数据库。宁愿不通过http 这样做!Heroku 支持的回答: 是的,如果您需要,可以。每个 Heroku 应用程序都会默认配置一个数据库,但一个应用程序可以通过将 DATABASE_URL 配置变量从一个应用程序复制到另一个应用程序来使用另一个应用程序的数据库。 (2认同)

小智 77

对相关问题的最新答案!

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
Run Code Online (Sandbox Code Playgroud)

链接:expanding_the_power_of_add_ons

  • 我使用的命令的格式是`heroku addons:attach originating_app_name :: HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name` (3认同)
  • 这是正确的答案.所有其他答案都已弃用,无论如何大多数都是重复的. (2认同)

Joh*_*non 15

据我所知,这是可能的 - 您必须使用数据库查看应用程序的heroku配置变量,然后将想要共享数据库的应用程序上的database_url设置为相同的值.有点偏离轨道,以及如何支持它我不知道.

编辑只是为了让我放心,我已经在Heroku上创建了两个应用程序 - 一个带标题的简单脚手架"帖子".

http://evening-spring-734.heroku.com/posts是主人

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

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

我所做的就是使用heroku配置来获取Evening-spring-734的DATABASE_URL,然后将相同的值设置为电子星系-230的DATABASE_URL.

你最终可能会遇到一些果味的DB竞争条件,但这绝对是可能的.

魔术吧?


Jos*_*ers 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
Run Code Online (Sandbox Code Playgroud)

然后,将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.
Run Code Online (Sandbox Code Playgroud)

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

  • 我问Heroku使用这种方法获得免费的Web dyno和免费的Worker dyno.这是他们的回应.>>"乔什 - 我们不鼓励这样做,但此外还会有工人闲置的问题.一旦它被闲置,它就会停止做任何工作而没有像网络请求那样'唤醒'它,它会是作为一名工人没用."<<所以看起来你可以在同一个数据库上使用多个应用程序,但它对于免费并不是很有用. (4认同)

Ste*_*elm 7

Amazon RDS插件适用于此.多个应用可以共享相同的RDS实例.

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