Partager la base de données entre 2 applications dans Heroku


89

Je souhaite accéder à la base de données d'une application à partir d'une autre application Heroku. Est-ce possible dans la base de données partagée?

Réponses:


100

ACTUALISÉ

À l'origine, cette réponse indiquait que même si cela était possible avec quelques astuces, c'était fortement déconseillé. Ceci était basé sur des conseils sur le site Web d'assistance aux développeurs Heroku. Cependant, récemment, Heroku a publié une communication décrivant spécifiquement comment y parvenir et a édulcoré ses conseils sur le site du développeur. Le texte complet de cette section de leur e-mail est inclus ci-dessous:

Saviez-vous que les applications Heroku peuvent partager une base de données commune? Par exemple, vous pouvez placer les fonctions d'analyse dans une application distincte de votre code destiné à l'utilisateur.

Définissez simplement la variable de configuration DATABASE_URL pour plusieurs applications sur la même valeur. Commencez par obtenir la DATABASE_URL de votre application existante:

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

Ensuite, définissez DATABASE_URL pour les nouvelles applications sur cette valeur:

$ 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

- maintenant, les deux applications partageront une base de données.

À titre de référence, le conseil original d'Heroku était de créer et d'utiliser une API pour accéder aux données à distance. Mon opinion personnelle est que dans l'ensemble, pour de nombreuses situations, c'est un bon conseil (c'est-à-dire mieux que de simplement connecter plusieurs applications à la même base de données), bien que je puisse voir des situations où cela poserait plus de problèmes que cela ne vaut la peine.

METTRE À JOUR

Selon les commentaires sur cette réponse, il convient de noter que Heroku se réserve le droit de modifier les URL de la base de données si nécessaire. Si cela se produit, vos connexions secondaires échoueront et vous devrez mettre à jour les URL en conséquence.


1
il suffit de configurer des applications sur Heroku pour prouver que c'est possible - détails dans ma réponse.
John Beynon

1
Assez juste, vote à la baisse retiré ... Le soutien d'Heroku donne une réponse différente! Question: Si je développe deux applications heroku, peuvent-elles accéder à une seule base de données? La raison pour laquelle je pose la question est que nous avons une application rails et une application sinatra, et qu'ils doivent partager une base de données postgres. Je préfère ne pas faire ça par http! Réponse du support heroku: Oui, si vous en avez besoin, vous pouvez. Chaque application Heroku obtient une base de données provisionnée par défaut, mais il est possible pour une application d'utiliser la base de données d'une autre application simplement en copiant la variable de configuration DATABASE_URL d'une application à une autre.
John Beynon

1
J'ai rétracté le vote négatif, mais la réponse acceptée est toujours incorrecte, tout comme un FYI.
John Beynon

1
ils disent qu'ils se réservent le droit de modifier l'URL de la base de données de vos applications, donc si cela se produit, vous devrez changer l'URL de la base de données que vous utilisiez manuellement.
John Beynon

7
il existe maintenant un moyen officiel heroku de partager DATABASE_URL entre les applications. voir la réponse par @ c360ian ci-dessous .
mobeets

81

Réponse de dernière minute à la question pertinente!

Heroku prend officiellement en charge une solution meilleure / gracieuse par le biais de leur framework d'addon maintenant. Il est décrit dans leur dernière newsletter sur la façon de partager des addons entre applications. Voici les extraits mentionnés dans l'écriture:

$ 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

Lien: expand_the_power_of_add_ons


Merci beaucoup!, Cela devrait être la réponse prioritaire!
HLL

2
C'est la bonne réponse. Toutes les autres réponses sont obsolètes, et la plupart d'entre elles sont de toute façon des doublons.
jelder

3
Le format de la commande que j'ai utilisé étaitheroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Marklar

15

pour autant que je sache que c'est possible - vous devrez regarder les variables de configuration heroku pour votre application avec la base de données, puis définir le database_url sur l'application qui souhaite partager la base de données sur la même valeur. Un peu hors piste cependant et quant à son soutien, je ne sais pas.

EDIT Juste pour me rassurer, j'ai créé deux applications sur Heroku - un simple «post» d'échafaudage avec un titre.

http://evening-spring-734.heroku.com/posts est le maître

http://electric-galaxy-230.heroku.com/posts - est l'esclave

Ainsi, les messages créés sur l'un ou l'autre seront écrits dans l'URL de la base de données de soir-printemps-734.

Tout ce que j'ai fait est d'utiliser heroku config pour obtenir la DATABASE_URL du soir-printemps-734, puis de définir la même valeur dans la DATABASE_URL de electric-galaxy-230.

Vous pourriez vous retrouver avec des conditions de course DB fruitées, mais c'est certainement possible de le faire.

De la magie, hein?


+1: Je vois cela comme étant très utile pour créer des URL courtes ou personnalisées .. comme myapp.me/iwasrobbed (Heroku App # 1) redirige vers myapp.com/users/1 (Heroku App # 2) puisque maintenant je peux stocker le nom personnalisé dans la base de données utilisateur standard. Merci John!
iwasrobbed

1
heroku pg: promouvoir DATABASE_URL --app votre_nom_app est le moyen pris en charge de définir cette variable.
Neil Middleton

mon seul commentaire concerne les conditions de course. Les travailleurs et l'instance Web seraient les mêmes, tout comme les travailleurs à distance comme le ferrailleur ou la file d'attente.
baash05

12

J'ai récemment reçu ceci dans la newsletter Heroku. Je leur envoie un e-mail pour savoir s'il s'agit vraiment d'une utilisation approuvée.

LE SAVIEZ-VOUS?

Partager une base de données avec de nombreuses applications

Saviez-vous que les applications Heroku peuvent partager une base de données commune? Par exemple, vous pouvez placer les fonctions d'analyse dans une application distincte de votre code destiné à l'utilisateur.

Définissez simplement la DATABASE_URL variable de configuration pour plusieurs applications sur la même valeur. Tout d'abord, obtenez le DATABASE_URLpour votre application existante:

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

Ensuite, définissez DATABASE_URLpour les nouvelles applications sur cette valeur:

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

C'est tout - maintenant, les deux applications partageront une base de données.


4
J'ai demandé à Heroku d'utiliser cette méthode pour obtenir à la fois un dyno Web gratuit et un dyno Worker gratuit. Voici leur réponse. >> "Josh - nous déconseillons de faire cela, mais en plus il y aurait des problèmes avec le travailleur inactif. Une fois qu'il était inactif, il cesserait de faire tout travail et sans rien pour le« réveiller »comme une requête Web, ce serait inutile en tant que travailleur. "<< On dirait donc que vous pouvez utiliser plusieurs applications sur la même base de données, mais ce n'est pas très utile gratuitement.
JoshRivers

Je l'utilise à des fins de développement, j'ai déjà des milliers de lignes dans mon application en direct, et la nouvelle apparence est en cours de développement dans une autre application heroku plus petite, donc pouvoir partager des données est cool, je peux développer et voir les nouveaux looks avec le mêmes données
Dvid Silva

7

Le plugin Amazon RDS fonctionne bien pour cela. Plusieurs applications peuvent partager la même instance RDS.

Vous avez la possibilité de leur faire partager des tables ou d'éviter la collision de noms de tables en utilisant le préfixe active_record.table_name_prefix.


1

Voir la référence Heroku: https://devcenter.heroku.com/categories/heroku-postgres

Q: Plusieurs applications Heroku peuvent-elles se connecter à une seule base de données?

Oui. Vous pouvez configurer plusieurs applications exécutées sur Heroku pour se connecter à une seule base de données, à condition que vous disposiez des informations d'identification de la base de données. Remplacez simplement DATABASE_URL des applications que vous souhaitez connecter à l'aide de la commande heroku config: add DATABASE_URL = ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.