在Heroku上两个应用程序之间共享数据库

99

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

6个回答

106

已更新

最初,这个答案声明虽然可以通过一些技巧实现,但是强烈不建议。这是基于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来远程访问数据。我个人认为,总体而言,对于许多情况来说这是个不错的建议(比如与仅连接多个应用程序到同一个数据库相比),尽管我可以看出有些情况可能会让人头疼。

更新

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


2
好的,取消了负评...Heroku支持团队给出了不同的答案!问题:如果我开发两个Heroku应用程序,它们可以访问单个数据库吗?我之所以问这个问题是因为我们有一个Rails应用程序和一个Sinatra应用程序,它们需要共享一个Postgres数据库。不想通过http来实现!Heroku支持团队的回答:是的,如果需要,您可以这样做。每个Heroku应用程序默认都会获得一个数据库,但是一个应用程序可以通过将DATABASE_URL配置变量从一个应用程序复制到另一个应用程序来使用另一个应用程序的数据库。 - John Beynon
1
@iWasRobbed - 谢谢,好主意。我没有在最新的通讯中注意到这一点。已经更新了内容,删除了关于防火墙等的评论(显然不再正确)。我注意到Heroku现在也从他们的网站上删除了原始答案所基于的建议,因此我认为他们现在对数据库共享感到满意。 - Paul Russell
1
请注意 @JohnBeynon 的话。他们可能会并且将更改您的 database_url。因此,如果您手动复制 URL,则应用程序将中断。检查“.profile.d 脚本”,以便在应用程序重新加载时自动执行此操作。 - Ron
1
这篇博客文章描述了如何在应用程序之间同步 DATABASE_URL。http://engineering.qmee.com/2014/05/06/accessing-a-database-from-multiple-apps-on-heroku/ - andorov
8
现在,Heroku 官方推出了一种在应用之间共享 DATABASE_URL 的方法。请查看 @c360ian 的回答(链接如下):https://dev59.com/T2025IYBdhLWcg3weV8s#28249767。 - mobeets
显示剩余9条评论

101

针对相关问题的最新答案来啦!

顺便提一下,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
2
这是正确的答案。所有其他答案都已作废,而且它们中的大多数都是重复的。 - jelder
7
我使用的命令格式是 heroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name - Marklar

15
据我所知,这是可能的 - 您需要查看具有DB的Heroku应用程序的配置变量,然后将database_url设置为要共享数据库的应用程序上相同的值。但是这有点偏题了,至于它有多受支持,我不知道。
编辑一下,我在Heroku上启动了两个应用程序 - 一个简单的脚手架“post”,带有标题。 http://evening-spring-734.heroku.com/posts 是主应用 http://electric-galaxy-230.heroku.com/posts 是从应用
因此,在任何一个应用程序上创建的帖子都将写入evening-spring-734的数据库URL。
我所做的就是使用heroku config获取evening-spring-734的DATABASE_URL,然后将相同的值设置到electric-galaxy-230的DATABASE_URL中。
您可能会遇到一些有趣的DB竞争条件,但绝对可以实现。
神奇吧?

+1:我认为这对于创建短链接或自定义链接非常有用,比如http://myapp.me/iwasrobbed(Heroku应用程序#1)重定向到http://myapp.com/users/1(Heroku应用程序#2),因为现在我可以将自定义名称存储在标准用户数据库中。感谢John! - iwasrobbed
1
heroku pg:promote DATABASE_URL --app your_app_name 是设置此变量的支持方式。 - Neil Middleton
我的唯一评论是关于竞争条件的。工作进程和Web实例将是相同的,远程工作者如Iron Worker或Resqueue也是如此。 - baash05

12

最近我在Heroku的通讯中收到了这个消息。 我正在给他们发电子邮件,以确定它是否真的是一个已批准的用法。

你知道吗?

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

你知道吗,Heroku应用程序可以共享一个公共数据库吗?例如,您可以将分析函数放在与用户界面代码不同的单独应用程序中。

只需将多个应用程序的DATABASE_URL 配置变量设置为相同的值即可。 首先,获取现有应用程序的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,以下是他们的回复。
“Josh-我们不鼓励这样做,而且还会有worker被闲置的问题。一旦它被闲置,它就不会再执行任何工作,并且没有类似于web请求的东西来“唤醒”它,作为worker它将变得无用。”<<
因此,看起来您可以在同一个DB上使用多个应用程序,但是这对于免费用户来说并不是很有用。
- 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即可。


这个URL已经失效了(很可能是因为答案的日期可以追溯到2012年)。更新的文档可以在这里找到 - https://devcenter.heroku.com/articles/heroku-postgresql#sharing-heroku-postgres-between-applications。 - Greg Sadetsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接