我制作了 2 个应用程序,应用程序 A 和应用程序 B。应用程序 A 的唯一目的是允许用户注册,而应用程序 B 的目的是从应用程序 A 中选择用户向他们发送电子邮件。由于 App A 和 B 是独立创建的,并且托管在 2 个单独的 Heroku 实例中,所以 App B 如何访问 App A 中的用户数据库?有没有办法将某些相关行从 App A 推送到 App B?
6 回答
目前没有办法在 Heroku 应用程序之间共享数据库。
您或许可以使用Amazon RDS插件运行专用 MySQL 实例。
另一种方法是创建 API 并在应用程序之间推送数据。您可以运行后台进程来将数据推入和推出。
您可以在同一个共享 PostgreSQL 数据库上连接多个 Heroku 实例,这由shared-database:5mb
Heroku 上的免费插件提供。
在您拥有数据库的实例上,键入:
$ heroku config
这将显示很多设置,您将在其中看到如下内容:
DATABASE_URL => postgres://fbksgiuqlv:BuIvJDfS_eOBDJDZCc9SP@ec2-104-20-247-168.compute-1.amazonaws.com/fbksgiuqlv
这是您的实例将使用的数据库连接字符串。
然后在其他实例上,通过键入以下内容覆盖 DATABASE_URL 配置变量:
$ heroku config:add DATABASE_URL=your_new_connection_string
所以做了一些修改,如下所示,它起作用了
prompt$ heroku console
Ruby console for your-app.heroku.com
>> dbconfig = YAML.load(File.read('config/database.yml'))
=> {"production"=>{"encoding"=>"unicode", "port"=>5432, "adapter"=>"postgresql", "username"=>"xxxxxxxxxxxxxx", "database"=>"xxxxxxxxxxxxx", "host"=>"kklasfdsfjsfdsfsd.fsdf.dsfdsf", "password"=>"xxxxxxxxxxxxxxxxxx"}}
puts dbconfig.to_yaml
---
production:
encoding: unicode
port: 5432
adapter: postgresql
username: xxxxxxxxxxx
database: xxxxxxxxxxxxxxx
host: ec2-50-2323kskdsakd231.amazonaws.com
password: xxxxxxxxxxxxxx
然后将 yaml 复制并粘贴到另一个数据库的连接中
它有效!为了我!!!
我也在研究这个问题,我注意到现在似乎可以真正做到这一点。
请参阅: http: //newsletterer.heroku.com/2011/07(底部的“你知道吗”部分)
基本上,您设置一个应用程序,检索应用程序数据库 url,然后将该 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.
就是这样——现在两个应用程序将共享一个数据库。
我还没有尝试过,但我正要试一试,因为我也在考虑将现有应用程序拆分为两个应用程序。让我们希望这真的有效!
Heroku 实际上会覆盖您签入的 database.yml 文件,您可以使用“heroku shell”命令并键入cat config/databse.yml
它们组成了一堆随机的东西,每个应用程序都使用它们。我不相信有可能阻止他们这样做。
如果您将模式与 PostgreSQL 一起使用,您可能能够做到这一点。