2012-10-18 106 views
3

MYSQL開發流程我敢肯定,類似的工作流程是常見的,但在我搜索我沒有發現任何記錄的例子。使用Git版本控制腳本

目標:

  1. 我要管理所有MySQL的(V5.1 +)數據庫定義的 git的,所以我有所有的源代碼控制的好處。
  2. 我想通過編輯腳本,並 運行的腳本來定義對數據庫的修改,這樣我可以在 編輯數據庫定義我的選擇(VIM)的編輯,而不是mysql外殼,或GUI 應用程序。

另外:我目前使用的是mysql shell,但是想用vim來維護在shell中變得笨拙的例程和事件。

計劃:

我會做的「--no數據」選項得到我最初的劇本最初的轉儲,但從那​​時起,我希望我的工作流程是:編輯腳本 - >提交 - >運行腳本而不是:執行數據庫更改 - > dump ddl - > commit。

注意事項:

如果我轉儲數據庫中的以下內容:

mysqldump -u [user] -p [password] --no-data --routines > ddl.sql 

它包括:

DROP TABLE IF EXISTS `[table]`; CREATE TABLE `[table]` ([table definition]) 

顯然,這會破壞,並重新創建表,如果我跑劇本。 我想要做的就是更新定義更改表如果表存在,否則創建表的定義。我寧願在一個[table]([table dfinition])塊中定義該表,這個被重用,而不是必須維護多個重複塊。

我會如何改變初始轉儲語法或腳本,這樣我可以使用相同的腳本來更新數據庫,並重新創建在另一個環境中的數據庫定義(無數據)?

回答

1

正如你指出的,只是mysqldump ING不適合這項工作。

一般情況下,你需要存儲更改數據庫結構。因此,而不是存儲:

// commit 1 
// foo.sql 
CREATE TABLE foo (foo_id INT); 

// commit 2 
// foo.sql 
CREATE TABLE foo (foo_id INT, foo_val INT); 

,可以儲存更多的東西一樣:

// commit 1 
// foo_1.sql 
CREATE TABLE foo (foo_id INT); 

// commit 2 
// foo_2.sql 
ALTER TABLE foo ADD COLUMN (foo_val INT); 

然後,你應該有一個可以運行

  • foo_1.sql
  • FOO_2的腳本。 SQL

在叔他正確的命令。

你甚至會更好編寫具有向上()腳本和向下()選項,讓您的遷移可以運行向前(建表,加列)和向後(刪除列,刪除表)。

你一定要記得你簽出依賴於數據庫變化的分支之前運行向後腳本。