Voglio accedere al database di un'app da un'altra app Heroku. È possibile nel database condiviso?
Risposte:
AGGIORNATO
In origine, questa risposta affermava che sebbene ciò fosse possibile con alcuni accorgimenti, era fortemente sconsigliato. Ciò si basava sui consigli sul sito Web di supporto per gli sviluppatori Heroku. Tuttavia, recentemente Heroku ha pubblicato una comunicazione che descrive specificamente come ottenere ciò e ha annacquato i suoi consigli sul sito degli sviluppatori. Il testo completo di questa sezione della loro e-mail è incluso di seguito:
Sapevi che le app Heroku possono condividere un database comune? Ad esempio, puoi inserire le funzioni di analisi in un'applicazione separata dal codice rivolto all'utente.
Imposta semplicemente la variabile di configurazione DATABASE_URL per diverse app sullo stesso valore. Innanzitutto, scarica DATABASE_URL per la tua app esistente:
$ heroku config | grep DATABASE_URL --app sushi DATABASE_URL => postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute1.amazonaws.com/ldfoiusfsf
Quindi, imposta DATABASE_URL per le nuove app su questo valore:
$ 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
- ora entrambe le app condivideranno un database.
Proprio come punto di riferimento, il consiglio originale di Heroku era di creare e utilizzare un'API per accedere ai dati da remoto. La mia opinione personale è che nel complesso, per molte situazioni questo è un buon consiglio , (cioè è meglio che connettere più applicazioni allo stesso DB) anche se posso vedere situazioni in cui sarebbe più problematico di quanto valga la pena.
AGGIORNARE
Come da commenti su questa risposta, vale la pena notare che Heroku si riserva il diritto di modificare gli URL del database come richiesto. In tal caso, le connessioni secondarie non riusciranno e sarà necessario aggiornare gli URL di conseguenza.
Risposta tardiva alla domanda pertinente!
Heroku ora supporta ufficialmente una soluzione migliore / graziosa per via del loro framework di componenti aggiuntivi. È descritto nella loro ultima newsletter su come condividere componenti aggiuntivi tra le app. Di seguito sono riportati gli snippet menzionati nell'articolo:
$ 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
per quanto ne so è possibile: dovrai guardare le variabili di configurazione di heroku per la tua app con il DB e quindi impostare database_url sull'app che vuole condividere il database sullo stesso valore. Un po 'fuori strada però e su quanto sia supportato non lo so.
MODIFICA Solo per riposare la mente ho creato due app su Heroku: un semplice "post" di scaffold con un titolo.
http://evening-spring-734.heroku.com/posts è il maestro
http://electric-galaxy-230.heroku.com/posts - è lo schiavo
Quindi i post creati su entrambi verranno scritti nell'URL del database di evening-spring-734.
Tutto quello che ho fatto è usare heroku config per ottenere il DATABASE_URL di evening-spring-734 e quindi impostare lo stesso valore nel DATABASE_URL di electric-galaxy-230.
Potresti finire con alcune condizioni di gara DB fruttate, ma è sicuramente possibile farlo.
Magia eh?
L'ho ricevuto recentemente nella newsletter di Heroku. Sto inviando loro un'e-mail per scoprire se si tratta davvero di un utilizzo approvato.
LO SAPEVATE?
Condivisione di un database con molte app
Sapevi che le app Heroku possono condividere un database comune? Ad esempio, puoi inserire le funzioni di analisi in un'applicazione separata dal codice rivolto all'utente.
È sufficiente impostare la
DATABASE_URL
variabile di configurazione per diverse app sullo stesso valore. Per prima cosa, ottieni l'DATABASE_URL
app per la tua app esistente:$ heroku config | grep DATABASE_URL --app sushi DATABASE_URL => postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute-1.amazonaws.com/ldfoiusfsf
Quindi, imposta
DATABASE_URL
per le nuove app questo valore:$ 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.
Questo è tutto: ora entrambe le app condivideranno un database.
Il plug-in Amazon RDS funziona bene per questo. Più app possono condividere la stessa istanza RDS.
Hai la flessibilità di consentire loro di condividere le tabelle o di evitare la collisione del nome della tabella utilizzando active_record.table_name_prefix.
Vedi il riferimento a Heroku: https://devcenter.heroku.com/categories/heroku-postgres
D: Più applicazioni Heroku possono connettersi a un singolo database?
Sì. Puoi configurare più applicazioni in esecuzione su Heroku per connettersi a un singolo database, a condizione che tu abbia le credenziali del database. Sovrascrivi semplicemente il DATABASE_URL delle app che desideri connettere utilizzando il comando heroku config: aggiungi DATABASE_URL = ... comando.