แชร์ฐานข้อมูลระหว่าง 2 แอพใน Heroku


91

ฉันต้องการเข้าถึงฐานข้อมูลของแอปจากแอป Heroku อื่น เป็นไปได้ในฐานข้อมูลที่ใช้ร่วมกันหรือไม่?

คำตอบ:


100

ปรับปรุงแล้ว

ในขั้นต้นคำตอบนี้ระบุว่าแม้ว่าจะเป็นไปได้ด้วยเทคนิคเล็กน้อย แต่ก็ไม่ท้อถอยอย่างยิ่ง นี่เป็นไปตามคำแนะนำในเว็บไซต์สนับสนุนนักพัฒนา Heroku อย่างไรก็ตามเมื่อเร็ว ๆ นี้ Heroku ได้ออกการสื่อสารที่อธิบายถึงวิธีการบรรลุเป้าหมายนี้โดยเฉพาะและได้ให้คำแนะนำกับไซต์ของนักพัฒนาซอฟต์แวร์ ข้อความที่สมบูรณ์ของส่วนนี้ของอีเมลมีอยู่ด้านล่าง:

คุณรู้ไหมว่าแอพ Heroku สามารถแชร์ฐานข้อมูลทั่วไปได้? ตัวอย่างเช่นคุณสามารถใส่ฟังก์ชั่นการวิเคราะห์ในแอปพลิเคชันแยกต่างหากจากรหัสผู้ใช้ของคุณ

เพียงแค่ตั้งค่า DATABASE_URL config var สำหรับหลาย ๆ แอพให้เป็นค่าเดียวกัน ขั้นแรกรับ 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 เพื่อพิสูจน์ว่าเป็นไปได้ - รายละเอียดในคำตอบของฉัน
John Beynon

1
พอใช้การลงคะแนนถูกถอนกลับ ... ฝ่ายสนับสนุน Heroku ให้คำตอบที่แตกต่างออกไป! คำถาม: ถ้าฉันพัฒนาแอพ heroku สองแอพพวกเขาสามารถเข้าถึงฐานข้อมูลเดียวได้หรือไม่? เหตุผลที่ฉันถามคือเรามีแอปพลิเคชันรางและแอปซินาตร้าและพวกเขาจำเป็นต้องแชร์ฐานข้อมูล postgres ค่อนข้างจะไม่ทำเช่นนั้นโดย http! คำตอบจากการสนับสนุน heroku: ใช่ถ้าคุณต้องการคุณสามารถทำได้ แอป Heroku ทุกแอปจะได้รับการจัดเตรียมฐานข้อมูลตามค่าเริ่มต้น แต่เป็นไปได้ที่แอปหนึ่งจะใช้ฐานข้อมูลของแอปอื่นได้ง่ายๆโดยการคัดลอก DATABASE_URL config var จากแอปหนึ่งไปยังอีกแอปหนึ่ง
John Beynon

1
ฉันถอนการโหวตลง แต่คำตอบที่ยอมรับยังคงไม่ถูกต้องเช่นเดียวกับ FYI
John Beynon

1
พวกเขากล่าวว่าพวกเขาขอสงวนสิทธิ์ในการเปลี่ยนแปลง URL ฐานข้อมูลแอปพลิเคชันของคุณดังนั้นหากเกิดขึ้นคุณจำเป็นต้องเปลี่ยน URL ฐานข้อมูลที่คุณใช้ด้วยตนเอง
John Beynon

7
ขณะนี้มีวิธี heroku อย่างเป็นทางการในการแบ่งปัน DATABASE_URL ระหว่างแอป ดูคำตอบโดย @ c360ian ด้านล่าง
mobeets

84

คำตอบที่ปลายเหตุสำหรับคำถามที่เกี่ยวข้อง!

Heroku สนับสนุนวิธีการแก้ปัญหาที่ดีกว่า / สง่างามอย่างเป็นทางการโดยใช้กรอบงาน addon ของพวกเขาในตอนนี้ มีอธิบายไว้ในจดหมายข่าวล่าสุดเกี่ยวกับวิธีแชร์ส่วนเสริมระหว่างแอพ ด้านล่างนี้เป็นตัวอย่างข้อมูลที่กล่าวถึงในการเขียน:

$ 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

ลิงก์: expand_the_power_of_add_ons


ขอบคุณมาก! นี่ควรเป็นคำตอบที่จัดลำดับความสำคัญ!
HLL

2
นี่คือคำตอบที่ใช่ คำตอบอื่น ๆ ทั้งหมดเลิกใช้แล้วและส่วนใหญ่ก็ซ้ำกัน
jelder

5
รูปแบบของคำสั่งที่ฉันใช้คือheroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Marklar

15

เท่าที่ฉันรู้ว่ามันเป็นไปได้ - คุณจะต้องดูตัวแปรการกำหนดค่า heroku สำหรับแอปของคุณด้วยฐานข้อมูลจากนั้นตั้งค่า database_url บนแอปที่ต้องการแชร์ฐานข้อมูลเป็นค่าเดียวกัน ฉันไม่ทราบวิธีการที่ได้รับการสนับสนุน

แก้ไขเพียงเพื่อตั้งสติฉันได้หมุนแอพสองตัวบน Heroku - 'โพสต์' แบบง่ายๆพร้อมชื่อ

http://evening-spring-734.heroku.com/postsเป็นหลัก

http://electric-galaxy-230.heroku.com/posts - เป็นทาส

ดังนั้นโพสต์ที่สร้างขึ้นจะถูกเขียนไปยัง URL ฐานข้อมูลของ evening-spring-734

สิ่งที่ฉันทำคือใช้ heroku config เพื่อรับ DATABASE_URL ของ evening-spring-734 จากนั้นตั้งค่าเดียวกันใน DATABASE_URL ของ electric-galaxy-230

คุณสามารถจบลงด้วยเงื่อนไขการแข่งขัน fruity DB แต่เป็นไปได้ที่จะทำ

เวทมนตร์เหรอ?


+1: ฉันเห็นว่าสิ่งนี้มีประโยชน์มากสำหรับการสร้าง URL แบบสั้นหรือแบบไร้สาระ .. เช่นmyapp.me/iwasrobbed (Heroku App # 1) เปลี่ยนเส้นทางไปที่myapp.com/users/1 (Heroku App # 2) ตั้งแต่ตอนนี้ฉันสามารถจัดเก็บ ชื่อโต๊ะเครื่องแป้งในฐานข้อมูลผู้ใช้มาตรฐาน ขอบคุณจอห์น!
iwasrobbed

1
heroku pg: โปรโมต DATABASE_URL - แอป your_app_name เป็นวิธีที่รองรับในการตั้งค่าตัวแปรนี้
Neil Middleton

ความคิดเห็นเดียวของฉันคือเงื่อนไขการแข่งขัน .. คนงานและเว็บอินสแตนซ์จะเหมือนกันเช่นเดียวกับคนงานระยะไกลเช่นคนงานเหล็กหรือคิว
baash05

12

ฉันได้รับสิ่งนี้ในจดหมายข่าว Heroku เมื่อเร็ว ๆ นี้ ฉันส่งอีเมลถึงพวกเขาเพื่อตรวจสอบว่าเป็นการใช้งานที่ได้รับอนุมัติจริงหรือ

เธอรู้รึเปล่า?

การแชร์ฐานข้อมูลเดียวกับหลายแอพ

คุณรู้ไหมว่าแอพ Heroku สามารถแชร์ฐานข้อมูลทั่วไปได้? ตัวอย่างเช่นคุณสามารถใส่ฟังก์ชั่นการวิเคราะห์ในแอปพลิเคชันแยกต่างหากจากรหัสผู้ใช้ของคุณ

เพียงตั้งค่าDATABASE_URL config 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
ฉันถาม Heroku เกี่ยวกับการใช้วิธีนี้เพื่อรับทั้ง Web dyno ฟรีและ Worker dyno ฟรี นี่คือคำตอบของพวกเขา >> "จอช - เราไม่สนับสนุนให้ทำเช่นนี้ แต่นอกจากนี้ยังมีปัญหากับการที่คนงานไม่ได้ทำงานเมื่อไม่มีการใช้งานมันจะหยุดทำงานใด ๆ และไม่มีอะไรจะ 'ปลุก' เหมือนคำขอทางเว็บก็จะเป็น ไม่มีประโยชน์ในฐานะคนทำงาน "<< ดูเหมือนว่าคุณสามารถใช้หลายแอพในฐานข้อมูลเดียวกันได้ แต่ก็ไม่มีประโยชน์มากนักสำหรับการใช้งานฟรี
JoshRivers

ฉันใช้มันเพื่อจุดประสงค์ในการพัฒนาฉันมีแถวหลายพันแถวในแอพถ่ายทอดสดของฉันและรูปลักษณ์ใหม่กำลังได้รับการพัฒนาในแอพ heroku ที่มีขนาดเล็กลงดังนั้นการแบ่งปันข้อมูลจึงเป็นเรื่องที่ยอดเยี่ยมฉันสามารถพัฒนาและดูรูปลักษณ์ใหม่ด้วย ข้อมูลเดียวกัน
Dvid Silva

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.