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

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

通過“重置”到當前架構來修復損壞的遷移

通過“重置”到當前架構來修復損壞的遷移

PHP
Qyouu 2022-10-14 15:59:10
我們已經接管了一個舊的(3 年)Symfony 3.3 項目,使用教義遷移 1.0 包來處理遷移。不幸的是,遷移腳本已經被破壞了一段時間,沒有人注意到,所以你不能在不檢查現有數據庫的情況下從源代碼重新構建。我想解決這種情況,以便運行composer doctrine:migrate基本上只是運行一個虛擬腳本,該腳本創建當前模式的樣子。我將如何做到這一點,以便在現有模式上運行它時不會中斷?我想我會按照這些思路做一些事情:檢查一個干凈的項目(帶有錯誤的舊遷移)獲取生產數據庫轉儲將生產數據庫模式轉儲到 SQL 文件刪除舊的遷移創建一個版本號與錯誤遷移中的“當前”/最高版本號相同的遷移文件運行遷移作為最后一步,通過刪除數據庫、導入生產數據庫轉儲然后運行migrate來驗證這是否確實有效,以驗證沒有任何中斷。我只是不確定如何在 Doctrine 包的上下文中執行此操作(我是 PHP 新手),即使在查閱了文檔之后(似乎并未涵蓋這種情況)。
查看完整描述

1 回答

?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

我做的和我上面勾勒的完全一樣,而且效果很好。對于上下文,我有一組用于遷移腳本的元數據:


"SELECT * FROM migration_versions" 

┌────────────────┐

│    version     │

├────────────────┤

│ 20161112122228 │

│ 20161113143631 │

│ 20161122223420 │

│ 20161124162611 │

│ 20161128151448 │

│ 20161207194257 │

│ 20161208114104 │

│ 20161208114105 │

│ 20170123074229 │

│ 20170125081729 │

│ 20170130080734 │

│ 20170130080820 │

│ 20170131082751 │

│ 20170201074705 │

│ 20170208092040 │

│ 20170208092917 │

│ 20170208103930 │

│ 20170608042313 │

│ 20170628044258 │

│ 20170930061118 │

└────────────────┘

這意味著我還會有一組相應的文件app/DoctrineMigrations/,稱為app/DoctrineMigrations/Version20170930061118.php. 只有最后一個文件以實際內容結束,其余的將是空的假人。


我的更改的 Git 日志

創建一個虛擬模板來替換現有遷移的內容


在某些時候,現有的遷移已經停止工作。這是在 2020 年 3 月 1 日左右發現的。


這意味著不可能從新的源代碼開始開發,使用教義:遷移:遷移命令,因為它很早就失敗了。


同時,現有數據庫包含有關過去執行了哪些遷移的元數據,因此任何修復都需要向遷移包發出信號,表明這些遷移已經/已經執行。


建議的解決方法是創建簡單的“標記類”,它只是滿足發出遷移已經完成/存在的信號的需要,然后用一個腳本替換最后一個遷移類的內容,該腳本只是創建一個與當前狀態匹配的模式生產數據庫是。


這是第 1 步。


將所有遷移腳本內容替換為空內容


這是修復中的第 2 步?;旧蠟?app/DoctrineMigrations/*.php 中的每個文件執行一個循環,并用虛擬模板替換它。這是完整的腳本


$ git show 773ccebee20425d7025152b338282f0a0034556f:app/DoctrineMigrations/create-dummy-migrations.sh

#!/bin/bash


for file in Version*.php; do 

    CLASS=$(basename $file .php)

    sed -e "s/CLASSNAME/$CLASS/" template.php > $file

done

這是完整的模板


git show 773ccebee20425d7025152b338282f0a0034556f:app/DoctrineMigrations/template.php

<?php


namespace Application\Migrations;


use Doctrine\DBAL\Migrations\AbstractMigration;

use Doctrine\DBAL\Schema\Schema;


/**

 * Dummy migration to fix faulty migration scripts issue 

 * discovered in March 2020.

 */

class CLASSNAME extends AbstractMigration

{

    /**

     * @param Schema $schema

     */

    public function up(Schema $schema)

    {

         $this->addSql('COMMENT ON table migration_versions IS \'migrations from 2016-2017 are stubs\'');

    }


    /**

     * @param Schema $schema

     */

    public function down(Schema $schema)

    {

    }

}

刪除助手


從 prod 轉儲模式


使用腳本清理架構


grep -v -- '--' production-schema-2020.sql \ 

  | awk 1 ORS=' ' \

  | sed -r -e 's/;\s+/; /g' > cleaned.sql

從 SQL 腳本生成 Doctrine PHP 語句


腳本:sed -e "s/^(.*);/\$this->addSql('\1');/" cleaned.sql > cleaned-sql-to-php-statements.txt


將模式語句移動到上次遷移 中基本上將內容從復制粘貼cleaned-sql-to-php-statements.txt到


刪除臨時文件


對生成的 PHP SQL 語句的小調整和清理


查看完整回答
反對 回復 2022-10-14
  • 1 回答
  • 0 關注
  • 115 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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