Condividi il database tra 2 app in Heroku


89

Voglio accedere al database di un'app da un'altra app Heroku. È possibile nel database condiviso?

Risposte:


100

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.


1
basta impostare le app su Heroku per dimostrare che è possibile - dettagli nella mia risposta.
John Beynon

1
Giusto, voto negativo ritirato ... Il supporto di Heroku dà una risposta diversa! Domanda: se sviluppo due app heroku, possono accedere a un unico database? Il motivo per cui lo chiedo è che abbiamo un'app rails e un'app sinatra, e hanno bisogno di condividere un database postgres. Preferirei non farlo tramite http! Risposta dell'assistenza heroku: Sì, se necessario, puoi farlo. Ogni app Heroku ottiene un database fornito per impostazione predefinita, ma è possibile che un'app utilizzi il database di un'altra app semplicemente copiando la var di configurazione DATABASE_URL da un'app all'altra.
John Beynon

1
Ho ritirato il voto negativo, ma la risposta accettata è ancora errata solo per tua informazione.
John Beynon

1
dicono che si riservano il diritto di modificare l'URL del database delle applicazioni, quindi, se ciò si verificasse, sarà necessario modificare manualmente l'URL del database che stavi utilizzando.
John Beynon

7
ora esiste un modo ufficiale heroku per condividere DATABASE_URL tra le app. vedere la risposta di @ c360ian di seguito .
mobeets

81

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

Link: expanding_the_power_of_add_ons


Grazie mille !, questa dovrebbe essere la risposta prioritaria!
HLL

2
Questa è la risposta esatta. Tutte le altre risposte sono deprecate e la maggior parte di esse sono comunque duplicate.
jelder

3
Il formato del comando che ho usato eraheroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Marklar

15

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?


+1: lo vedo molto utile per creare URL brevi o vanity .. come myapp.me/iwasrobbed (Heroku App # 1) reindirizza a myapp.com/users/1 (Heroku App # 2) poiché ora posso memorizzare il nome vanity nel DB utente standard. Grazie John!
rubato il

1
heroku pg: promuovi DATABASE_URL --app your_app_name è il modo supportato per impostare questa variabile.
Neil Middleton

il mio unico commento riguarda le condizioni di gara. I lavoratori e l'istanza web sarebbero gli stessi, così come i lavoratori remoti come iron worker o resqueue.
baash05

12

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_URLapp 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_URLper 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.


4
Ho chiesto a Heroku di utilizzare questo metodo per ottenere sia un banco prova Web gratuito che un banco prova lavoro gratuito. Ecco la loro risposta. >> "Josh - sconsigliamo di farlo, ma in aggiunta ci sarebbero problemi con il lavoratore inattivo. Una volta che era inattivo, smetterebbe di fare qualsiasi lavoro e senza nulla che lo 'riattivi' come una richiesta web, sarebbe inutile come lavoratore. "<< Quindi sembra che tu possa usare più app sullo stesso DB, ma non è molto utile gratuitamente.
JoshRivers

Lo sto usando per scopi di sviluppo, ho già migliaia di righe nella mia app live e il nuovo aspetto è in fase di sviluppo in un'altra app heroku più piccola, quindi essere in grado di condividere i dati è fantastico, posso sviluppare e vedere i nuovi look con il stessi dati
Dvid Silva

7

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.


1

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.