2013-07-31 183 views
4

我開始使用PostgreSQL爲我的項目構建一個新的數據庫。 (我的方式是新來的Pos​​tgreSQL和數據庫。)PostgreSQL開發工作流程

我覺得我的開發流程是非常糟糕的,這裏是它的一部分:

  1. 創建pgAdmin的表/視圖/函數。
  2. 在保存代碼之前確定文件的名稱。
    目標是能夠通過運行所有保存的腳本自動重新創建數據庫,
    我需要知道爲了依賴性原因運行這些腳本的順序。
    所以我爲每個文件添加一個數字來表示順序。 例如:001_create_role_user.ddl,002_create_database_project.ddl,013_user_table.ddl
  3. 保存代碼。
  4. 使用GIT將文件提交到存儲庫。

這裏有一些劣品我能想到的:

  • 我很容易忘記我做了什麼樣的變化。例如,創建了一個新類型 或編輯註釋
  • 很難確定文件的名稱(順序)。
  • 更改代碼將是一個痛苦的屁股,特別是當新的 代碼更改順序。

所以我的工作流程很糟糕。我想知道其他Postgres開發人員的工作流程是什麼樣子。

是否有任何好工具(免費或便宜)來編輯和保存腳本?好IDE可能?

如果我可以爲數據庫創建自動單元測試,那將會很棒。

任何重新創建數據庫的工具? CI服務器工具?

基本上我正在尋找任何建議,良好的做法,或數據庫開發的好工具。

(對不起,這個問題可能不適合用於Q &的一種格式,但我不知道還有什麼地方要問這個問題。)

回答

2

退房liquibase。我們在我工作的公司使用它來設置我們的PostgreSQL數據庫。它是開源的,易於使用,並且您最終得到的文件可以添加到源代碼管理。每個changeset都會獲得一個ID,以便每個更改集只運行一次。最終會有兩個額外的表用於跟蹤運行時數據庫的更改。

雖然它與數據庫無關,但您可以直接在每個變更集中使用PostgreSQL SQL,並且每個變更集都可以擁有自己的註釋。

使用它的唯一警告是,您必須警告自己和其他人在應用到數據庫後不要重新使用變更集。對已經應用的變更集進行的任何更改都會導致不同的校驗和(甚至是空白),從而導致liquibase放棄其更新。這可能會導致該字段中的數據庫更新失敗,因此應該先在本地對每個更新日誌的更新進行本地測試。相反,所有更改(無論次要)都應該插入到具有新ID的新變更集中。他們有一個叫做「validCheckSum」的變更集子標籤,可以讓你解決這個問題,但是我認爲最好總是試圖執行一個新的變更集。

例如,以下是creating a tablecreating a view的文檔鏈接。

1

那麼,你的問題實際上是任何數據庫開發人員非常相關的,如果我的理解正確,還有另一種方法可以達到你想要的結果。

有趣的是,您將不同文件分成不同的變化的想法是Ruby On Rails遷移的概念。您甚至可以使用rake實用程序來跟蹤您的工作流程。

但現在到我認爲你的解決方案。 PostgreSQL和其他人都是真誠的,他們有特定的工具來處理數據和模式,比如你可能需要的東西。

pg_dumpall命令行可執行文件將轉儲整個數據庫到文件或控制檯,以一種方式,psql工具可以方便地「刷新」到同一個或另一個(處女)數據庫。

所以,如果你想保持運行的數據庫集羣的只有當前模式(無數據!),你可以像Postgres的進程所有者的用戶:

$ pg_dumpall --schema-only > schema.sql 

現在schema.sql文件將持有完全相同的用戶/數據庫/表/觸發器/等,但不包含數據。如果您想要「完全備份」樣式轉儲(並且這是對數據庫進行完全備份的一種方法),只需從命令行中刪除「--schema-only」選項即可。

您可以重新加載該文件到另一個(應該是處女,你可能會亂用其他數據這樣一個數據庫):

$ psql -f schema.sql postgres 

現在,如果你只想轉儲一個數據庫,一個表等你應該使用pg_dump工具。

$ pg_dump --schema-only <database> > database-schema.sql 

,然後將數據庫重裝到運行PostgreSQL服務器:

$ psql <database> < database-schema.sql 

至於版本控制,你可以保持schema.sql文件文件下它,只需再次轉儲數據庫在每個vc提交之前寫入文件。因此,在某些特定的版本控制狀態下,您將擁有與之配套的代碼和工作數據庫模式。

呵呵,我提到的所有工具都是免費的,pg_dump和pg_dumpall都帶有標準的PostgreSQL安裝。

希望幫助,

馬爾科

1

你不遠了。我是一個Java開發者,而不是一個DBA,而是建立了一個項目的發展數據庫是我一直對球隊的重要任務,在這裏是如何我已經看到了它做得最好:

  1. 所有數據庫更改都由DDL(SQL創建,更改或刪除語句)純文本腳本驅動。沒有通過DB客戶端進行更改。使用支持語法突出顯示的文本編輯器,例如vim或notepad ++,因爲突出顯示可幫助您在運行腳本之前找到錯誤。
  2. 在每個DDL腳本的開頭使用一個數字來定義腳本運行的順序。基本腳本的編號較小。隨着項目的增長,使用alter new alter腳本來更改表格,不要在初始腳本中重新定義表格。
  3. 使用腳本和psql客戶端從最低到最高加載DDL腳本。這是我們使用的bash腳本。您可以將它用作Windows上的.bat腳本的基礎。

#!/斌/慶典

出口PGDATABASE = your_db出口

出口PGUSER = your_user出口

出口PGPASSWORD = your_password

爲SQL_SCRIPT在$(找到./ -name 「* .SQL」 - 打印|排序);

echo "**** $SQL_SCRIPT ****" 
    psql -q < $SQL_SCRIPT  

  1. 隨着項目的發展,用新修改腳本,更改表,不重新定義表中的初始腳本。

  2. 所有腳本都簽入到源代碼管理中。每個版本都被標記,以便將來可以重新生成該版本的數據庫。

  3. 對於單元測試和CI,大多數CI服務器可以運行腳本來刪除並重新創建模式。 PostgreSQL的單元測試一個經常被引用的框架是pgTAP

1

我是一個DBA和我的工作流程幾乎等於由@Ireeder建議的......但除了使用腳本外殼保持更新DDL腳本,我使用了一個名爲dbmaintain的工具DBMaintain

DbMaintain需要一些配置,但它不是一種痛苦......它保持對執行哪些腳本以及以何種順序的控制。 主要好處是,如果已執行的腳本sql發生更改,則默認情況下會投訴,或者僅執行該腳本(如果配置爲執行此操作)......當您在環境中添加新腳本它只執行那個新的腳本。

它是完美的部署和維護開發和生產環境的最新...沒有必要每次執行所有腳本(如Ireeder提供的shell)或需要手動執行每個新腳本。

0

如果更改了時隙,您可以創建執行DDL更改並轉儲預期數據庫新狀態(版本)的腳本。

pg_dump -f database-dump-production-yesterday.sql // all commands to create populate a startup 

今天需要引入一個新表新功能

psql -f change-production-for-today.sql // DDL and DML commands to make database reflect the new state 
pg_dump --schema -f dump-production-today.sql // all new commands to create database for today app 
psql -i sql-append-table-needed-data-into-dump.sql -f dump-production-today.sql 

所有的開發者應該使用新的數據庫從現在開始發展創造腳本。