当前位置: 代码迷 >> 综合 >> 如何在项目中集成Doctrine Migrations
  详细解决方案

如何在项目中集成Doctrine Migrations

热度:35   发布时间:2023-12-17 10:02:25.0

1.Doctrine Migrations是什么?

团队开发中,每个开发人员对于数据库都修改都必须手动记录,上线时需要人工整理,运维成本极高。而且在多个开发者之间数据结构同步也是很大的问题。Doctrine Migrations组件把数据库变更加入到代码中和代码一起进行版本管理,很好的解决了上述问题。

实际作用:

  版本管理:把数据库变更写入到代码中,来进行版本管理

  数据库同步:可以执行对应的文件创建数据表结构

总结:用代码来对数据库进行操作。

2.如何集成使用

1.下载依赖:

使用composer 工具下载对应的依赖,确保composer下载的版本与自己php版本一致。

执行命令: composer require doctrine/migrations ^1.5

本例使用php5.6,因此指定了版本1.5,也可以不指定版本下载,会自动适配对应版本下载对应依赖。

 

^1.5 ~1.5 1.5 三个的区别。、

1) ^1.5 是小版本更新,假设1.5的最新版本为1.5.2的,那么重新安装依赖时会下载该小版本的最新版本,即1.5.2

2) ~1.5是大版本更新,如果最新为1.6,那么重新下载依赖时会下载1.6版本的

3) 1.5 则为指定1.5版本下载,不会随外界版本更新而更新所下载的依赖版本

 

2.配置文件

 

1)在项目根目录中创建db目录,db目录下创建migrations目录及main.php入口文件,并给予可执行权限。

 

2)修改main.php,写入一下内容:

#!/usr/bin/env php
<?php
require_once '../vendor/autoload.php';
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Migrations\Configuration\Configuration;
use Doctrine\DBAL\Migrations\Tools\Console\ConsoleRunner;
use Doctrine\DBAL\Migrations\Tools\Console\Helper\ConfigurationHelper;
use Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Helper\QuestionHelper;//运行方式为db目录下./main.php 接以下参数
//migrations:execute     Execute a single migration version up or down manually.
//migrations:generate    Generate a blank migration class.
//migrations:latest      Outputs the latest version number
//migrations:migrate     Execute a migration to a specified version or the latest available version.
// --dry-run是空转参数,只显示操作结果,不执行修改
// --write-sql=file.sql 不执行操作,只写入文件,对于生产环境需要手动验证并执行的场景有用
//migrations:status      View the status of a set of migrations.
//migrations:up-to-date  Tells you if your schema is up-to-date.
//migrations:version     Manually add and delete migration versions from the version table.// 此处配置  假设配置文件pdo.php在  根目录/config/default/pdo.php 数据库名为test
return ['db' => ['database_name' => 'test','xxx'=> 'xxx','xxx'=> 'xxx'    ]
];
$config = '配置文件模块名';  // default
$folder = '配置文件文件夹名';  //test
$db = '数据库文件对应数据库名'; //db// 读取数据库配置信息
$configFile = __DIR__ ."/../config/{$config}/pdo.php";
if (!file_exists($configFile)) {echo '配置不存在' . PHP_EOL;exit;
}
$dbConfig = include $configFile;// 创建放置版本文件的文件夹
$migrationFolder = __DIR__ ."/migrations/{$folder}";
if (!is_dir($migrationFolder)){if (!mkdir($migrationFolder)){echo "文件夹生成失败,请手动生成[$migrationFolder]" . PHP_EOL;exit;}
}// 数据库映射
$config = $dbConfig[$db];//对应数据库连接信息字段,字符串要确保一致,避免乱码
$dbParams = ['driver' => 'pdo_mysql','host' => $config['master'],'port' => $config['port'],'dbname' => $config['database_name'],'user' => $config['username'],'password' => $config['password'],'charset'=> 'UTF8'
];try {$connection = DriverManager::getConnection($dbParams);
} catch (DBALException $e) {echo $e->getMessage() . PHP_EOL;exit;
}// 迁移组件配置
$configuration = new Configuration($connection);
$configuration->setName('Doctrine Migrations');
$configuration->setMigrationsNamespace('migrations\udb_center');
$configuration->setMigrationsTableName('migration_versions');
$configuration->setMigrationsDirectory('migrations/udb_center');
// 创建命令脚本
$helper_set = new HelperSet(['question' => new QuestionHelper(),'db' => new ConnectionHelper($connection),new ConfigurationHelper($connection, $configuration),
]);
$cli = ConsoleRunner::createApplication($helper_set);
try {$cli->run();
} catch (Exception $e) {echo $e->getMessage() . PHP_EOL;
}

3.如何使用

常用命令如下:

//migrations:generate    Generate a blank migration class.
//migrations:migrate     Execute a migration to a specified version or the latest available version.
//migrations:execute     Execute a single migration version up or down manually.
//migrations:latest      Outputs the latest version number
// --dry-run是空转参数,只显示操作结果,不执行修改
// --write-sql=file.sql 不执行操作,只写入文件,对于生产环境需要手动验证并执行的场景有用
//migrations:status      View the status of a set of migrations.
//migrations:up-to-date  Tells you if your schema is up-to-date.
//migrations:version     Manually add and delete migration versions from the version table.

 本文参考自:

 https://www.cnblogs.com/tbphp/p/9158719.html