Поділіться базою даних між двома програмами в Heroku


90

Я хочу отримати доступ до бази даних програми з іншої програми Heroku. Чи можливо це у спільній базі даних?

Відповіді:


100

ОНОВЛЕНО

Спочатку ця відповідь стверджувала, що, хоча це було можливо за допомогою декількох хитрощів, це було настійно не рекомендується. Це базувалося на порадах на веб-сайті підтримки розробників Heroku. Однак нещодавно Heroku опублікував повідомлення, в якому конкретно описується, як цього досягти, і знизив їх поради на сайті розробника. Повний текст цього розділу їх електронного листа міститься нижче:

Чи знали ви, що програми Heroku можуть спільно використовувати загальну базу даних? Наприклад, ви можете розмістити функції аналітики в окремій програмі від вашого орієнтованого на користувача коду.

Просто встановіть значення змінної конфігурації DATABASE_URL для кількох програм на одне і те ж значення. Спочатку отримайте DATABASE_URL для існуючого додатка:

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

Потім встановіть для DATABASE_URL для нових програм таке значення:

$ 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

- тепер обидва додатки матимуть спільну базу даних.

Орієнтиром, оригінальною порадою Heroku було створення та використання API для віддаленого доступу до даних. Я особисто вважаю, що в цілому для багатьох ситуацій це хороша порада (тобто краще, ніж просто підключення кількох програм до однієї БД), хоча я бачу ситуації, коли це буде більше проблем, ніж це варте.

ОНОВЛЕННЯ

Відповідно до коментарів до цієї відповіді, варто зазначити, що Heroku залишає за собою право змінювати URL-адреси бази даних у міру необхідності. Якщо це станеться, це призведе до виходу з ладу вторинних з’єднань, і вам потрібно буде відповідно оновити URL-адреси.


1
просто налаштуйте програми на Heroku, щоб довести, що це можливо - деталі у моїй відповіді.
Джон Бейнон,

1
Досить справедливо, голос проти відкликано ... Підтримка Heroku дасть іншу відповідь! Питання: Якщо я розроблю дві програми heroku, чи зможуть вони отримати доступ до однієї бази даних? Причиною, з якою я запитую, є те, що у нас є програма для рейок та програма для синатри, і вони мають спільний доступ до бази даних postgres. Краще не робити цього за допомогою http! Відповідь від служби підтримки heroku: Так, якщо вам потрібно, ви можете. Кожен додаток Heroku отримує базу даних, передбачену за замовчуванням, але одна програма може використовувати базу даних іншої програми, просто скопіювавши конфігураційний змінний DATABASE_URL з однієї програми в іншу.
Джон Бейнон,

1
Я відкликав голос проти, але прийнята відповідь все ще є неправильною, так само як FYI.
Джон Бейнон,

1
вони кажуть, що залишають за собою право змінити URL-адресу бази даних ваших програм, тому, якщо це сталося, вам потрібно буде змінити URL-адресу бази даних, яку ви використовували вручну.
Джон Бейнон,

7
тепер є офіційний спосіб героку ділитися DATABASE_URL між програмами. див. відповідь @ c360ian нижче .
mobeets

82

Пізня відповідь на відповідне питання!

Heroku офіційно підтримує краще / витончене рішення за допомогою їх аддону. Це описано в їх останньому бюлетені про те, як ділитися аддонами між програмами. Нижче наведені фрагменти, згадані в описі:

$ 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

Посилання: розширення_потужності_доданих_


Велике спасибі !, це має бути пріоритетною відповіддю!
HLL

2
Це правильна відповідь. Усі інші відповіді застаріли, і більшість із них все одно є дублікатами.
jelder

4
Формат команди, яку я використав,heroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Марклар,

15

наскільки я знаю, це можливо - вам доведеться розглянути змінні конфігурації heroku для вашого додатка з БД, а потім встановити URL-адресу database_url у програмі, яка хоче надати спільне використання бази даних таким же значенням. Хоча це не так, і я не знаю, наскільки це підтримується.

РЕДАГУВАТИ Щоб просто роздумувати, я запустив два додатки на Heroku - простий "пост" на лісі з заголовком.

http://evening-spring-734.heroku.com/posts - головний

http://electric-galaxy-230.heroku.com/posts - це підлеглий

Тож дописи, створені на будь-якому з них, будуть записані в URL-адресу бази даних за вечір-весна-734.

Все, що я зробив, це використати конфігурацію heroku, щоб отримати DATABASE_URL veče-spring-734, а потім встановити те саме значення в DATABASE_URL електричної галактики-230.

У вас можуть виникнути деякі фруктові умови гонки DB, але це, безумовно, можливо.

Чарівна га?


+1: Я вважаю це дуже корисним для створення коротких або марнославних URL-адрес .. як myapp.me/iwasrobbed (додаток Heroku №1) переспрямовує на myapp.com/users/1 (додаток Heroku №2), оскільки тепер я можу зберігати ім'я марнославства у стандартній базі даних користувача. Спасибі Джоне!
iwasrobbed

1
heroku pg: просування DATABASE_URL --app your_app_name підтримується способом встановлення цієї змінної.
Ніл Міддлтон,

мій єдиний коментар стосується умов перегонів. Робітники та веб-екземпляр будуть однаковими, як і віддалені працівники, такі як залізний працівник чи відряд.
baash05

12

Нещодавно я отримав це в бюлетені Heroku. Я надсилаю їм електронного листа, щоб з’ясувати, чи справді це дозволене використання.

ТИ ЗНАВ?

Спільний доступ до однієї бази даних із багатьма програмами

Чи знали ви, що програми Heroku можуть спільно використовувати загальну базу даних? Наприклад, ви можете розмістити функції аналітики в окремій програмі від вашого орієнтованого на користувача коду.

Просто встановіть значення DATABASE_URL конфігурації var для кількох програм на одне і те ж значення. По-перше, отримайте DATABASE_URLдля існуючого додатка:

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

Потім встановіть DATABASE_URLдля нових програм значення:

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

Ось і все - тепер обидва додатки матимуть спільну базу даних.


4
Я запитав Героку про використання цього методу, щоб отримати як безкоштовну веб-версію dyno, так і безкоштовну програму Worker. Ось їх відповідь. >> "Джош - ми не рекомендуємо робити це, але крім того, можуть виникати проблеми з робочим простоєм. Після того, як він перейде в режим очікування, він перестане виконувати будь-яку роботу, і нічого не буде" розбуджувати "його, як веб-запит, це буде марний як працівник. "<< Отже, схоже, ви можете використовувати кілька програм в одній БД, але це не дуже корисно безкоштовно.
JoshRivers

Я використовую його для цілей розробки, у мене вже є тисячі рядків у моєму живому додатку, а новий зовнішній вигляд розробляється в іншому меншому додатку heroku, тому можливість спільного використання даних - це круто, я можу розробляти і бачити новий зовнішній вигляд за допомогою ті ж дані
Двід Сільва

7

Для цього добре працює плагін Amazon RDS. Кілька програм можуть спільно використовувати один і той же екземпляр RDS.

Ви маєте гнучкість, щоб вони могли обмінюватися таблицями або уникати зіткнення імен таблиць, використовуючи префікс active_record.table_name_prefix.


1

Див. Посилання на Heroku: https://devcenter.heroku.com/categories/heroku-postgres

З: Чи можуть кілька додатків Heroku підключатися до однієї бази даних?

Так. Ви можете налаштувати кілька програм, що працюють на Heroku, для підключення до однієї бази даних, за умови, що у вас є облікові дані баз даних. Просто перевизначте DATABASE_URL програм, які ви хочете підключити, за допомогою конфігурації heroku: додайте команду DATABASE_URL = ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.