[Doctrine Migrations] 数据库迁移组件的深入解析四:集成 diff 方式迁移组件

本文深入探讨如何在不使用Symfony ORM的情况下,集成Doctrine Migrations的diff方式,实现数据库迁移。通过源码解析、脚本编写、添加黑名单过滤和脚本增强,展示了如何将diff方式完美融入项目,同时指出了diff方式的局限性。
摘要由CSDN通过智能技术生成

场景及优势

熟悉Symfony框架之后,深刻感受到框架集成的ORM组件Doctrine2的强大之处,其中附带的数据迁移也十分方便。Doctrine2是使用Doctrine DBAL组件把代码里面的表结构与实际数据库中的表结构进行对比的方式进行数据迁移。这种方式比之前版本管理的方式更加精准也更方便。

Symfony框架是自身ORM组件支持,但是很多项目并没有使用其中的ORM功能,或者有自己的ORM组件,又该如何集成diff方式的迁移呢?下面我们就来完成这个任务。

源码解析

在研究组件源码时,发现一个类:Doctrine\DBAL\Migrations\Provider\SchemaDiffProvider,其中getSqlDiffToMigrate方法就是我们编写diff脚本的关键。

/**
 * @param Schema $fromSchema
 * @param Schema $toSchema
 * @return string[]
 */
public function getSqlDiffToMigrate(Schema $fromSchema, Schema $toSchema)
{
   
    return $fromSchema->getMigrateToSql($toSchema, $this->platform);
}

该方法通过传入的两个入参(fromSchema和toSchema),来对比旧数据结构和新数据结构的差异,最后返回相关的sql语句。那么我们只要拿到现有数据库中的表结构,以及代码里面的表结构,就能实现diff方式的数据迁移了。

获取现有数据库的表结构可以通过上面的createFromSchema方法直接获取。

然后我们需要把数据结构写入代码,再从代码中获取实时的表结构,最后diff。

编写diff脚本

首先在项目创建diff文件,并赋予执行权限。之后是根据上面的思路来编写脚本,以下是完整代码示例:

#!/usr/bin/env php
<?php
require_once 'vendor/autoload.php';

use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Migrations\Provider\SchemaDiffProvider;
use Doctrine\DBAL\Schema\MySqlSchemaManager;
use Doctrine\DBAL\Schema\Schema;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值