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 語句的小調整和清理
- 1 回答
- 0 關注
- 115 瀏覽
添加回答
舉報