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:
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.
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
heroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
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?
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 leDATABASE_URL
pour 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_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.
C'est tout - maintenant, les deux applications partageront une base de données.
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.
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 = ...