2013-01-16 30 views
1

我正在研究一個非常重要的數據庫驅動的Web應用程序。我接近最初的版本,所以我已經鎖定了這個版本的功能,但是在發佈之後會實現很多其他功能。這些功能將不可避免地需要對數據庫模型進行一些修改,所以我擔心在每個發行版上遷移數據庫的複雜性。我想知道的是,我應該多關注自己現在鎖定一個可靠的數據庫設計,以便我能夠快速發佈,而不是現在就試圖預測某些功能,以便在發佈之前將其構建到數據庫中?我也預計會發現我目前的模型存在缺陷,並可能想要對其進行更改,但如果我釋放應用程序,然後數據開始進入,遷移數據將是我想象的困難任務。是否有傳統的方法來解決這類問題?一個正確的方向將是非常有用的。如何在發佈後更新數據庫驅動的應用程序?

對於一些背景我正在開發CG生產管道的資產管理系統。因此,它們之間有許多連接的大量數據。它基於網絡,完全用Python編寫,它使用SQLAlchemy和SQLite引擎。

回答

2

一些想法來管理數據庫用於生產應用程序:

  1. 創建備份每晚。這是至關重要的,因爲如果你嘗試更新(對數據或模式),並且你搞砸了,你需要能夠恢復到更穩定的狀態。

  2. 創建環境。你應該有一個像開發數據庫本地副本的東西,一個臨時數據庫供其他人在上線之前查看和測試,當然還有一個生產數據庫,您的實時系統指向該數據庫。

  3. 在本地開始開發之前,確保所有三個環境都同步。通過這種方式,您可以隨時跟蹤更改。

  4. 開始編寫腳本併爲其發佈版本。確保將它們存儲在源代碼管理系統(SVN,Git等)中。您只需要一個歷史記錄,說明發生了什麼變化,還有一小部分腳本需要在給定版本中運行。只是幫助你保持組織。

  5. 對您的本地數據庫進行更改並進行測試。確保你的腳本有兩件事情,1)修改數據的腳本,或者架構,2)腳本,這些腳本可以在事情出錯的情況下完成。在本地反覆測試。運行腳本,測試然後回滾。事情還好嗎?

  6. 在分段上運行腳本並查看一切是否仍然正常。再次證明你的工作很好,如果需要,你可以撤消你的改變。

  7. 一旦登臺很好,並且您有信心,可以在生產數據庫上運行腳本。請記住,您有用於更改數據(更新,刪除語句)和腳本以更改模式(添加字段,重命名字段,添加表)的腳本。

一般來說,請花時間在您的行爲中謹慎行事。越有紀律,你越有信心。更新數據庫可能會很嚇人,所以不要急於求成,寫出你的行動計劃,並測試,測試和測試!

1

我看到(和喜歡)的一種方法是名爲versions的表,其中只包含一個id。

然後有一個updates.sql腳本,有類似這樣的結構:

DELIMITER $$ 

CREATE PROCEDURE IF NOT EXISTS DBUpdate() 
BEGIN 

IF (SELECT id FROM versions) = 1 THEN 
    CREATE TABLE IF NOT EXISTS new_feature_table(
    id INT PRIMARY KEY AUTO-INCREMENT, 
    blah VARCHAR(128) ..., 
); 

IF (SELECT id FROM versions) = 2 THEN 
    CREATE TABLE IF NOT EXISTS newer_feature_table(
    id INT PRIMARY KEY AUTO-INCREMENT, 
    blah VARCHAR(128) ..., 
); 

END$$ 

DELIMITER ; 

CALL PROCEDURE DBUpdate(); 

然後你寫一個python腳本來檢查更新資料庫,連接到數據庫,並運行到架構進行任何更改通過這個程序。這很好,因爲你只需要一個帶有適當id值的versions表來構建出整個數據庫(沒有數據,也就是說;參見ryan1234有關數據備份的回答)。

相關問題