3 回答

TA貢獻1966條經驗 獲得超4個贊
不,通常你不應該這樣做。讓我首先澄清一個似乎是錯誤的概念:遷移不包含完整的數據庫模式,只包含將數據庫從一個版本帶到下一個版本所需的查詢。該系統允許對數據庫更改進行管理和版本控制。所以你應該開始看到一些問題:
遷移可能依賴于前一個。例如 v1 添加一個實體,v2 添加一個新字段。如果刪除 v1,v2 將被破壞,也需要刪除。
由于數據庫遷移通常與對象模型更改同時進行,因此您還必須恢復模型,否則您會發現不存在字段的映射問題。
當您還沒有任何功能時,這在設計階段可能是可以接受的。您可以使用 還原單個遷移bin/console doctrine:migrations:execute --down <version>
。如果需要進行調整,這通常在測試更改時完成。但通常在該更改尚未提交時。
Doctrine 使用名為migration_versions
. 通過用日期命名它們,它可以對它們進行排序并按順序應用它們。每當執行遷移時,它都會將遷移名稱添加到此表中。當您回滾它時,它會從表中刪除它,以及遷移本身中的字段。請記住,即使您可以回滾遷移,但這并不意味著一切都會如此。如果遷移刪除了一個列,該列將在回滾時重新創建,但數據將丟失。
至于“能不能做到”?是的。如果您真的很想,請徹底閱讀文檔并了解所有這些。
因此,由于您的問題是關于合并遷移,讓我們來解決您的實際選擇:
我可以手動刪除它們嗎(在 PHPStorm 中右鍵單擊然后刪除)然后轉到命令行并執行
php bin/console doctrine:migrations:migrate
?
不,這行不通。migrate
將應用可用的遷移。它們不會是任何,正如所解釋的,修訂仍將在表中并應用其更改。
或者我需要做
php bin/console doctrine:schema:update
什么?
這也不會做任何事情,因為它將模型與數據庫進行比較并發現它們匹配。
在任何情況下,您都需要先還原它們,然后再創建一個等效的。該命令是doctrine:migrations:diff
. 這會將模型與架構進行比較并生成遷移以使數據庫同步。為此,execute --down
您首先需要進行遷移,否則它們不會有任何更改,但可能會在此過程中丟失一些數據。
如果您在團隊中工作,他們將看到遷移消失。有些甚至可能落后于歷史并且沒有應用所有遷移。這很快就會成為管理的痛點。有一個rollup
命令(根據我的理解并且從未實際使用過它)從表中清除過時的遷移,轉儲完整的模式并應用它。這將是您最好的選擇,但請注意,這將刪除您的數據。
您還可以手動組合您的遷移。它們只是帶有up
和down
方法的類。組合所有函數體,應用清理過程并收工。
現在,如果你想這樣做,這應該不是什么大問題。只需用新版本替換過時的版本并警告所有人。但是,如果您想要做的是因為它們根本不存在并保持整潔的提交歷史記錄,那么這就是您的隊友可能想要殺死您的時候,因為這將涉及重寫歷史記錄。當你這樣做時,他們將不得不重新調整他們所有的工作。
如果你想這樣做:
進行備份
盡早引入您的更改以避免中斷。如果數據庫中有一些未使用的字段一段時間就可以了,直到模型提交趕上。如果您遲到并且某些對象需要它,則可能有人會被迫創建遷移并在此過程中破壞您的遷移。
做對(最好是第一次嘗試)。在您進行廣泛測試之前不要推動。
進行備份
控制臺命令參考

TA貢獻1775條經驗 獲得超8個贊
沒有一種“安全”的方法可以做到這一點,但是如果您還沒有部署遷移,那么您可以安全地丟棄一系列自動生成的遷移并重新生成它們。請注意不要同時丟棄手動遷移 SQL。
通常在設計階段我們會:
使用
doctrine:schema:update --force
直到事情相當穩定穩定后,我們從快照重置開發數據庫
運行
doctrine:migrations:diff
,然后在必要時手動添加遷移查詢

TA貢獻1796條經驗 獲得超10個贊
一般來說是的,你可以。但是您應該知道 Doctrine/Migration 將執行的遷移保存在 DB 中。因此,在更新數據庫之后,您應該刪除不必要的遷移文件(可能將所有查詢合并為一個)。
表名默認“ doctrine_migration_version ”只是刪除不必要的版本行
- 3 回答
- 0 關注
- 168 瀏覽
添加回答
舉報