2018年9月13日 星期四

Rails schema 到底怎麼保持乾淨


在不能 access production database 的情況下:

1. 怎麼保持 local database schema 是乾淨的
2. 如果髒了,怎麼恢復成乾淨的而且不影響現在 local 有的資料(乾淨的資料恢復,不乾淨的就丟掉)


## Idea 1:

Rails 內建的一些方法

要把 db 弄乾淨最簡單就是

db:drop, db:create, db:schema:load

直接 db:schema:load 的話不會刪掉多的 table

https://stackoverflow.com/questions/10301794/difference-between-rake-dbmigrate-dbreset-and-dbschemaload

問題:

1. db 資料會被清空
2. 必須仰賴 db:seed 保持乾淨並 up to date


## Idea 2:

dump db 出來,在 restore 的時候選擇性的 restore

pg_dump test-docker_development -c > tmp/dirty_dump.sql


問題:

1. schema_migration 的 table 會是錯的,不好改
2. pg_restroe 會暴力的把 table 內的資料結構改掉(如果不一樣),可能會造成 table 跟schema 不符合的問題



## Idea 3:

有一台只跟 production 跑一樣環境的機器,從上面要資料

問題:

1. 若 production 跑 task,這台機器也要跟著跑,不然資料一樣是錯的


## Conclusion

db:seed 檔就是為此而生的,但之所以會沒有人更新的原因是大家並沒有很常需要用到 seed 檔案,例如 deploy 到 staging 測試時 staging 本來就會有測試的舊資料(雖然很髒),所以不需要跑 seed,對 developer 而言也就不會 care 這麼多,反正這次我可以測就好,下次有人有問題再說。

所以問題就變成「要讓 seed 檔案在開發以及測試過程中扮演重要角色,這樣才有可能維護一個乾淨的 local 開發 schema & data」


要做到提升 seed 重要性就要改 Staging 測試的方式,例如讓 staging 用類似 docker container 的技術每次測試的時候都跑一個新的 App 並執行 seed,這樣就會強迫 developer 更新 seed 而且保持開發和測試效率





沒有留言:

張貼留言