2010-07-23 40 views
2

我創建了兩個在heroku上基本相同的應用程序。他們開始與衆不同,因爲我正在測試上傳到heroku,並在進行調整時遇到一些挑戰。如何合併兩個數據庫與Heroku上相同的架構?

但現在事情似乎有效,但都有數據,我想鞏固。由於它們運行的​​是同一個git存儲庫,因此代碼與遷移相同。

似乎我需要把它在本地和合並,但不完全清楚如何做到這一點。在谷歌上進行了一些搜索,沒有任何明確的。

我想要一步一步的幫助,我沒有一個明確的過程。

1)我有兩個應用程序在我有數據庫的heroku上。他們有相同的模式;

2)我不需要知道數據來自何處:我只需要它都駐留在一個單一的數據庫

3)我想能夠與特定的SQL命令來做到這一點,與手動打開(不知道我會怎麼做)然後進行調整,因爲大約有10個不同的相關表。

謝謝!

+0

合併數據後,您是否需要區分數據的來源? – 2010-07-23 18:21:06

+0

不......它只是一組數據。 – Angela 2010-07-24 00:01:53

回答

0

要關閉這個 - 決定隻手動選擇正確的數據,然後重新輸入,所以我可以做一些錯誤檢查 - 一個痛苦的,但這種做法似乎並不有一個簡單的答案。自我注意:保留全部生產數據與試駕。

2

有沒有自動的方式來做到這一點,因爲沒有辦法以通用的方式自動化(沒有做一些你想做的事情)。因此,這需要幾個步驟,但您可以一直使用工具。

您可以使用Heroku的內置工具來獲取表的轉儲。首先下載並將數據導入到數據庫中,然後將其轉儲到文本文件(SQL格式)中。

將SQL中的其中一個數據集作爲文本之後,您需要稍微編輯該文件。您需要將其作爲導入腳本,而不是通過刪除現有行(或表)開始的「重建數據庫」腳本。如果你小心,它可能已經是正確的格式,但可能會有一些事情會關閉。

有您能碰上幾個陷阱:

  • 爲records--如果你已經生成的密鑰,你可能do--那麼你就必須重新編號他們在數據集要導入。可能有辦法在沒有生成密鑰的情況下導出它們,但我所做的是使用快速grep將它們重新編號到我正在合併的數據庫範圍之外。
  • 如果在其他表中引用了這些鍵(作爲外鍵),則還必須重新編號。
  • 有些表可能是「參考表」,兩個系統上都是一樣的,所以您可以跳過導入它們。
  • 某些表可能不需要合併。

一旦您的文本文件狀態良好,請在本地運行並對其進行測試。如果它弄糟了,不要擔心 - 只需下載生產數據(您要導入的數據),然後重試。迭代,直到你有一切在當地正常工作。然後,將文件上傳到heroku。

我知道這聽起來像幾個步驟 - 它是。不過,沒有棘手的問題需要解決。你只需要慢慢小心地去。讓別人與你配對,以幫助你思考。

+0

謝謝...所以本地數據庫在sqlite3 ....我不知道如何打開,它看起來只是亂碼。所以我不確定如何做到這一點 - 沒有工具存在? – Angela 2010-07-29 04:01:19

+0

您可以運行 sqlite3/path/to/database 能夠在其上執行命令。 – 2010-07-30 17:07:43

+0

我看......我想我正在尋找特定的命令來實際合併文件在一起,包括像更改引用的一些東西的東西?或者它可以打開在一個簡單的平面文件? – Angela 2010-08-02 01:29:48

2

假設你不需要消除重複,你可以爲每個表做

insert into db1.tablea 
select * from db2.tablea ; 

一些併發症:

  • 如果表有ID列,您需要確保他們不衝突,用新的ID
  • 更換舊的id,但由於IDS是聯繫表上的按鍵,你需要確保在每個表中的新ID匹配。

這裏有一個快速和骯髒的方式做到這一點:

  • 查找最高的ID在任何表中的第一個數據庫。
  • 調用max_key_db1。
  • 然後更新在第二數據庫中的所有鍵是current_value加max_key_db1。

請注意,你需要更新此兩主鍵和外鍵工作,例如:

update db2.tablea set id = id + max_key_db1, foreign_id = foreign_id + max_key_db1; 
update db2.tableb set id = id + max_key_db1, a_id = a_id + max_key_db1; 
etc. 

現在你有所有按鍵的自洽DB2(主鍵和外)具有db1中不存在的值;換句話說,您的密鑰在兩個數據庫中都是唯一的

現在,您可以插入從DB2行到DB1:

insert into db1.tablea 
select * from db2.tablea ; 

注意這不會工作,如果插入創建使用自動增量或觸發自己的ID的表;在這種情況下,你必須明確指定ciolumns並關閉所有自動生成的ID:

insert into db1.tablea(id, foreign_id, col1, ...) 
select id, foreign_id, col1 from db2.tablea ; 

或者,你都可以在一個步驟中的每個表離開DB2不變,這樣做:

insert into db1.tablea(id, foreign_id, col3, col4) 
select id + max_key_db1, foreign_id + max_key_db1, col3, col4 from db2.tablea ; 

當然,這樣做的所有交易裏面,不承擔任何責任,直到你確信你已經得到的每個表和所有是正確的。然後在您的數據庫的副本上執行此操作。

現在,既然你使用DB1的最高鍵,不論表的,有可能你的ID將是不連續的,但誰在乎呢?鑰匙是鑰匙。你需要做的是重置每個表的所有auto_increment或sequence,以便下一個自動生成的鍵高於該表中的最高鍵。你怎麼做取決於你正在使用的RDBMS。

+0

索裏問一個noob問題,但sqlite3看起來像一個平面文件,我在哪裏實際發出這些命令? – Angela 2010-08-07 17:30:52

+0

運行(從命令行)數據庫上的sqlite:sqlite3 database-name – tpdi 2010-08-08 11:15:22

+0

所以這是一步一步的....你會如何建議我做副本?我可能需要一步一步,因爲我不確定如何做到這一點......我已經添加了一個賞金:) – Angela 2010-09-07 04:42:25

0

如果您只需要操作一次,你能得到它容易使用的MS Access完成。

您可以通過在可視化查詢設計器中創建一些查詢來解決任何衝突。

您可以使用odbc driver for sqllite3連接到sqlite3數據庫並在訪問中鏈接這些表。

相關問題