资讯专栏INFORMATION COLUMN

[Doctrine Migrations] 数据库迁移组件的深入解析二:自定义集成

luoyibu / 695人阅读

摘要:结语到此,数据迁移组件就已经很灵活的集成到我们自己的项目中了,而且你还可以根据自己的项目灵活修改自定义命令脚本文件。但是如果使用久了会发现现在的数据迁移会有两个问题不支持类型,在相关中,官方开发人员有回复所以只能添加自定义类型。

自定义命令脚本 目录结构

目前的项目结构是这样的(参照代码库):

其中,db/migrations文件夹是迁移类文件夹,config/db.php是我们项目原有的db配置,migrations.phpmigrations-db.php是迁移组件需要的配置文件。

编写自定义命令脚本

现在先在根目录新建文件:migrate,没有后缀名,并且添加可执行权限。

并且参照组件原有的命令脚本vendor/doctrine/migrations/doctrine-migrations.php,首先获取项目原有的数据库配置信息,替换掉migrations-db.php数据库配置文件:

$db_config = include "config/db.php";
$db_params = [
    "driver" => "pdo_mysql",
    "host" => $db_config["host"],
    "port" => $db_config["port"],
    "dbname" => $db_config["dbname"],
    "user" => $db_config["user"],
    "password" => $db_config["password"],
];
try {
    $connection = DriverManager::getConnection($db_params);
} catch (DBALException $e) {
    echo $e->getMessage() . PHP_EOL;
    exit;
}

然后配置组件,替换掉migrations.php配置文件:

$configuration = new Configuration($connection);
$configuration->setName("Doctrine Migrations");
$configuration->setMigrationsNamespace("dbmigrations");
$configuration->setMigrationsTableName("migration_versions");
$configuration->setMigrationsDirectory("db/migrations");

最后是完整的命令脚本代码:

#!/usr/bin/env php
 "pdo_mysql",
    "host" => $db_config["host"],
    "port" => $db_config["port"],
    "dbname" => $db_config["dbname"],
    "user" => $db_config["user"],
    "password" => $db_config["password"],
];
try {
    $connection = DriverManager::getConnection($db_params);
} catch (DBALException $e) {
    echo $e->getMessage() . PHP_EOL;
    exit;
}
// 迁移组件配置
$configuration = new Configuration($connection);
$configuration->setName("Doctrine Migrations");
$configuration->setMigrationsNamespace("dbmigrations");
$configuration->setMigrationsTableName("migration_versions");
$configuration->setMigrationsDirectory("db/migrations");
// 创建命令脚本
$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;
}

现在执行迁移相关命令时,用./migrate替换之前的vendor/bin/doctrine-migrations部分即可。

同时migrations.phpmigrations-db.php这两个配置文件也可以删除了。

PhpStorm集成迁移命令

如果你使用PhpStorm,命令行还可以集成到开发工具中去,会有自动提示,大大提高工作效率:

PhpStorm -> Preferences -> Command Line Tool Support -> 添加

Choose tool选择Tool based on Symfony Console,点击OK

Alias输入m, Path to PHP executable 选择php路径,path to script选择跟目录下的migrate文件

点击OK,提示 Found 9 commands 则配置成功。

PhpStorm -> Tools -> Run Command,弹出命令窗口,输入m即会出现命令提示。

结语

到此,数据迁移组件就已经很灵活的集成到我们自己的项目中了,而且你还可以根据自己的项目灵活修改自定义命令脚本文件。

但是如果使用久了会发现现在的数据迁移会有两个问题:

不支持tinyint类型,在相关issues中,官方开发人员有回复:

"Tiny integer" is not supported by many database vendors. DBAL"s type system is an abstraction layer for SQL types including type conversion from PHP to database value and back. I am assuming that your issue refers to MySQL, where we do not have a distinct native SQL type to use for BooleanType mapping. Therefore MySQL"s TINYINT is used for that purpose as is fits best from all available native types and in DBAL we do not have an abstraction for tiny integers as such (as mentioned above).

What you can do is implement your own tiny integer custom type and tell DBAL to use column comments (for distinction from BooleanType in MySQL). That should work. See the documentation.

To tell DBAL to use column comments for the custom type, simply override the requiresSQLCommentHint() method to return true.
所以只能添加自定义类型。

另外一个问题,就是不支持enum类型。深入代码之后,发现enum类型的特殊格式并不好融入到组件中去,自定义类型也不能支持,但是如果你是半途中加入数据迁移组件,现在项目中如果已经有了数据表结构,且包含enum类型的字段,那么使用迁移组件是会报错。

那么,下一章我们就来完成这两件事:添加tinyint的自定义类型,解决enum报错的问题。

在我的代码库可以查看这篇文章的详细代码,欢迎star。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28799.html

相关文章

  • [Doctrine Migrations] 据库迁移组件深入解析三:定义数据字段类型

    摘要:自定义根据官方文档,新建类,集成,并重写,,,等方法。如果集成迁移组件的时候数据库里已经存在表且有类型的字段,那么执行迁移命令时就会报错。下一章我们来详细研究如何集成方式的数据迁移组件。 自定义type 根据官方文档,新建TinyIntType类,集成Type,并重写getName,getSqlDeclaration,convertToPHPValue,getBindingType等方...

    ysl_unh 评论0 收藏0
  • [Doctrine Migrations]据库迁移组件深入解析一:安装与使用

    摘要:是基于组件的数据迁移组件。版本管理把数据库变更写入到代码中,来进行版本管理。此系列文章不讨论现有框架中数据迁移组件的使用,而是着重于探讨如何单独使用迁移组件以及如何把数据迁移组件集成到自己的项目个性化定制。 场景分析 团队开发中,每个开发人员对于数据库都修改都必须手动记录,上线时需要人工整理,运维成本极高。而且在多个开发者之间数据结构同步也是很大的问题。Doctrine Migrati...

    phpmatt 评论0 收藏0
  • php 学习指南及技术干货

    摘要:安全生成安全的随机数,加密数据,扫描漏洞的库一个兼容标准的过滤器一个生成随机数和字符串的库使用生成随机数的库一个安全库一个纯安全通信库一个简单的键值加密存储库一个结构化的安全层一个试验的面向对象的包装库一个扫描文件安全的库 Security 安全 生成安全的随机数,加密数据,扫描漏洞的库 HTML Purifier-一个兼容标准的HTML过滤器 RandomLib-一个生成随机数和字...

    lifefriend_007 评论0 收藏0
  • php 学习指南及技术干货

    摘要:安全生成安全的随机数,加密数据,扫描漏洞的库一个兼容标准的过滤器一个生成随机数和字符串的库使用生成随机数的库一个安全库一个纯安全通信库一个简单的键值加密存储库一个结构化的安全层一个试验的面向对象的包装库一个扫描文件安全的库 Security 安全 生成安全的随机数,加密数据,扫描漏洞的库 HTML Purifier-一个兼容标准的HTML过滤器 RandomLib-一个生成随机数和字...

    skinner 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<