Teilen Sie die Datenbank zwischen 2 Apps in Heroku


89

Ich möchte von einer anderen Heroku-App aus auf die Datenbank einer App zugreifen. Ist das in der gemeinsam genutzten Datenbank möglich?

Antworten:


100

AKTUALISIERT

Ursprünglich wurde in dieser Antwort angegeben, dass dies zwar mit wenigen Tricks möglich war, jedoch stark davon abgeraten wurde. Dies beruhte auf Ratschlägen auf der Heroku-Entwickler-Support-Website. Kürzlich veröffentlichte Heroku jedoch eine Mitteilung, in der speziell beschrieben wurde, wie dies erreicht werden kann, und verwässerte ihre Ratschläge auf der Entwicklerseite. Der vollständige Text dieses Abschnitts ihrer E-Mail ist unten enthalten:

Wussten Sie, dass Heroku-Apps eine gemeinsame Datenbank gemeinsam nutzen können? Beispielsweise können Sie Analysefunktionen in einer von Ihrem benutzerbezogenen Code getrennten Anwendung ablegen.

Setzen Sie einfach die Konfigurationsvariable DATABASE_URL für mehrere Apps auf denselben Wert. Holen Sie sich zunächst die DATABASE_URL für Ihre vorhandene App:

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

Setzen Sie dann die DATABASE_URL für neue Apps auf diesen Wert:

$ 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

- Jetzt teilen sich beide Apps eine Datenbank.

Als Referenz diente Herokus ursprünglicher Rat, eine API für den Remotezugriff auf Daten zu erstellen und zu verwenden. Meine persönliche Ansicht ist, dass dies in vielen Situationen insgesamt ein guter Rat ist (dh besser als nur mehrere Anwendungen mit derselben Datenbank zu verbinden), obwohl ich Situationen sehen kann, in denen dies mehr Probleme verursachen würde, als es wert ist.

AKTUALISIEREN

Gemäß den Kommentaren zu dieser Antwort ist es erwähnenswert, dass Heroku sich das Recht vorbehält, Datenbank-URLs nach Bedarf zu ändern. In diesem Fall schlagen Ihre sekundären Verbindungen fehl und Sie müssen die URLs entsprechend aktualisieren.


1
Richten Sie einfach Apps auf Heroku ein, um zu beweisen, dass dies möglich ist - Details in meiner Antwort.
John Beynon

1
Fair genug, Abstimmungsergebnis zurückgezogen ... Heroku-Unterstützung gibt eine andere Antwort! Frage: Wenn ich zwei Heroku-Apps entwickle, können diese auf eine einzige Datenbank zugreifen? Der Grund, den ich frage, ist, dass wir eine Rails-App und eine Sinatra-App haben und sie eine Postgres-Datenbank gemeinsam nutzen müssen. Würde das lieber nicht per http machen! Antwort vom Heroku-Support: Ja, wenn nötig, können Sie. Jede Heroku-App erhält standardmäßig eine Datenbank, aber es ist möglich, dass eine App die Datenbank einer anderen App verwendet, indem sie einfach die Konfigurationsvariable DATABASE_URL von einer App in eine andere kopiert.
John Beynon

1
Ich habe die Abwahl zurückgenommen, aber die akzeptierte Antwort ist immer noch falsch, nur als FYI.
John Beynon

1
Sie behalten sich das Recht vor, die URL Ihrer Anwendungsdatenbank zu ändern. In diesem Fall müssten Sie die manuell verwendete Datenbank-URL ändern.
John Beynon

7
Es gibt jetzt eine offizielle Heroku-Möglichkeit, die DATABASE_URL zwischen Apps zu teilen. siehe die Antwort von @ c360ian unten .
Mobeets

80

Aktuelle Antwort auf die relevante Frage!

Heroku unterstützt jetzt offiziell eine bessere / elegantere Lösung durch das Addon-Framework. In ihrem neuesten Newsletter wird beschrieben, wie Addons zwischen Apps ausgetauscht werden können. Nachfolgend sind die in der Beschreibung erwähnten Ausschnitte aufgeführt:

$ 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

Link: Erweiterung der Leistung von Addons


Vielen Dank!, Dies sollte die priorisierte Antwort sein!
HLL

2
Das ist die richtige Antwort. Alle anderen Antworten sind veraltet und die meisten sind sowieso Duplikate.
Jelder

3
Das Format des Befehls, den ich benutzte, warheroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Marklar

15

Soweit ich weiß, ist dies möglich. Sie müssen die Heroku-Konfigurationsvariablen für Ihre App mit der Datenbank überprüfen und dann die Datenbank-URL für die App festlegen, die die Datenbank für denselben Wert freigeben möchte. Ein bisschen aus der Bahn und wie unterstützt es ist, weiß ich nicht.

BEARBEITEN Um mich zu beruhigen, habe ich zwei Apps auf Heroku gestartet - einen einfachen Gerüst-Beitrag mit einem Titel.

http://evening-spring-734.heroku.com/posts ist der Meister

http://electric-galaxy-230.heroku.com/posts - ist der Sklave

Auf beiden erstellte Beiträge werden also in die Datenbank-URL von night-spring-734 geschrieben.

Ich habe nur die Heroku-Konfiguration verwendet, um die DATABASE_URL von Abend-Frühling-734 abzurufen und dann den gleichen Wert in die DATABASE_URL von Elektro-Galaxie-230 zu setzen.

Sie könnten mit einigen fruchtigen DB-Rennbedingungen enden, aber das ist definitiv möglich.

Magie, oder?


+1: Ich sehe dies als sehr nützlich an, um kurze oder Eitelkeits-URLs zu erstellen . Wie myapp.me/iwasrobbed (Heroku App # 1) leitet zu myapp.com/users/1 (Heroku App # 2) weiter, da ich jetzt speichern kann Der Vanity-Name in der Standardbenutzer-DB. Danke John!
Ich wurde

1
heroku pg: fördern DATABASE_URL --app your_app_name ist die unterstützte Methode zum Festlegen dieser Variablen.
Neil Middleton

Mein einziger Kommentar bezieht sich auf die Rennbedingungen. Arbeiter und Webinstanz wären die gleichen wie entfernte Arbeiter wie Eisenarbeiter oder Rettungskräfte.
Baash05

12

Ich habe dies kürzlich im Heroku-Newsletter erhalten. Ich sende ihnen eine E-Mail, um herauszufinden, ob es sich wirklich um eine genehmigte Verwendung handelt.

WUSSTEST DU?

Eine Datenbank mit vielen Apps teilen

Wussten Sie, dass Heroku-Apps eine gemeinsame Datenbank gemeinsam nutzen können? Beispielsweise können Sie Analysefunktionen in einer von Ihrem benutzerbezogenen Code getrennten Anwendung ablegen.

Stellen Sie einfach die DATABASE_URL Konfigurationsvariable für mehrere Apps auf den gleichen Wert ein. Holen Sie sich zunächst die DATABASE_URLfür Ihre vorhandene App:

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

Stellen Sie dann DATABASE_URLfür neue Apps diesen Wert ein:

$ 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.

Das war's - jetzt teilen sich beide Apps eine Datenbank.


4
Ich habe Heroku gefragt, ob er diese Methode verwenden möchte, um sowohl einen kostenlosen Web-Dyno als auch einen kostenlosen Worker-Dyno zu erhalten. Hier ist ihre Antwort. >> "Josh - wir raten davon ab, aber es würde auch Probleme geben, wenn der Arbeiter im Leerlauf ist. Sobald er im Leerlauf ist, würde er keine Arbeit mehr ausführen und es würde nichts wie eine Webanforderung" wecken " Als Arbeiter nutzlos. "<< Es sieht also so aus, als könnten Sie mehrere Apps in derselben Datenbank verwenden, aber es ist kostenlos nicht sehr nützlich.
JoshRivers

Ich benutze es für Entwicklungszwecke, ich habe bereits Tausende von Zeilen in meiner Live-App, und das neue Erscheinungsbild wird in einer anderen kleineren Heroku-App entwickelt, sodass es cool ist, Daten zu teilen. Ich kann das neue Aussehen mit dem entwickeln und sehen gleiche Daten
Dvid Silva

7

Das Amazon RDS-Plugin funktioniert hierfür gut. Mehrere Apps können dieselbe RDS-Instanz gemeinsam nutzen.

Sie haben die Flexibilität, Tabellen gemeinsam zu nutzen oder eine Kollision mit Tabellennamen mithilfe des Präfixes active_record.table_name_prefix zu vermeiden.


1

Siehe Heroku-Referenz: https://devcenter.heroku.com/categories/heroku-postgres

F: Können mehrere Heroku-Anwendungen eine Verbindung zu einer einzigen Datenbank herstellen?

Ja. Sie können mehrere Anwendungen, die auf Heroku ausgeführt werden, für die Verbindung mit einer einzelnen Datenbank konfigurieren, sofern Sie über die Anmeldeinformationen der Datenbank verfügen. Überschreiben Sie einfach die DATABASE_URL der Apps, die Sie mit der Heroku-Konfiguration verbinden möchten: Fügen Sie den Befehl DATABASE_URL = ... hinzu.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.