亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Symfony 4:如何安全地“加入”遷移?/ 刪除第一個和最后一個之間的遷移?

Symfony 4:如何安全地“加入”遷移?/ 刪除第一個和最后一個之間的遷移?

PHP
catspeake 2021-10-15 17:42:12
我最近在調整我的數據庫并注意到我在現有的 2 個之上進行了 5 次遷移??偣?7 次,m1、m2、...、m7。從這 5 個中,我只想要最新版本。所以我想我可以刪除 m3、m4、m5、m6、m7 并再次遷移,這將導致 m3 已經包含我滿意的最終版本。現在我以前從未這樣做過,想知道最安全的方法是什么?我正在使用 PHPStorm。我可以手動刪除它們嗎(在 PHPStorm 中右鍵單擊然后刪除)然后轉到命令行并執行php bin/console doctrine:migrations:migrate?或者我需要做php bin/console doctrine:schema:update什么?或者這真的是個壞主意?
查看完整描述

3 回答

?
慕標5832272

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命令(根據我的理解并且從未實際使用過它)從表中清除過時的遷移,轉儲完整的模式并應用它。這將是您最好的選擇,但請注意,這將刪除您的數據。

您還可以手動組合您的遷移。它們只是帶有updown方法的類。組合所有函數體,應用清理過程并收工。

現在,如果你想這樣做,這應該不是什么大問題。只需用新版本替換過時的版本并警告所有人。但是,如果您想要做的是因為它們根本不存在并保持整潔的提交歷史記錄,那么這就是您的隊友可能想要殺死您的時候,因為這將涉及重寫歷史記錄。當你這樣做時,他們將不得不重新調整他們所有的工作。

如果你想這樣做:

  • 進行備份

  • 盡早引入您的更改以避免中斷。如果數據庫中有一些未使用的字段一段時間就可以了,直到模型提交趕上。如果您遲到并且某些對象需要它,則可能有人會被迫創建遷移并在此過程中破壞您的遷移。

  • 做對(最好是第一次嘗試)。在您進行廣泛測試之前不要推動。

  • 進行備份

控制臺命令參考


查看完整回答
反對 回復 2021-10-15
?
www說

TA貢獻1775條經驗 獲得超8個贊

沒有一種“安全”的方法可以做到這一點,但是如果您還沒有部署遷移,那么您可以安全地丟棄一系列自動生成的遷移并重新生成它們。請注意不要同時丟棄手動遷移 SQL。

通常在設計階段我們會:

  1. 使用doctrine:schema:update --force直到事情相當穩定

  2. 穩定后,我們從快照重置開發數據庫

  3. 運行doctrine:migrations:diff,然后在必要時手動添加遷移查詢


查看完整回答
反對 回復 2021-10-15
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

一般來說是的,你可以。但是您應該知道 Doctrine/Migration 將執行的遷移保存在 DB 中。因此,在更新數據庫之后,您應該刪除不必要的遷移文件(可能將所有查詢合并為一個)。

表名默認“ doctrine_migration_version ”只是刪除不必要的版本行


查看完整回答
反對 回復 2021-10-15
  • 3 回答
  • 0 關注
  • 168 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號