摘要:是基于组件的数据迁移组件。版本管理把数据库变更写入到代码中,来进行版本管理。此系列文章不讨论现有框架中数据迁移组件的使用,而是着重于探讨如何多带带使用迁移组件以及如何把数据迁移组件集成到自己的项目个性化定制。
场景分析
团队开发中,每个开发人员对于数据库都修改都必须手动记录,上线时需要人工整理,运维成本极高。而且在多个开发者之间数据结构同步也是很大的问题。Doctrine Migrations组件把数据库变更加入到代码中和代码一起进行版本管理,很好的解决了上述问题。
Doctrine Migrations是基于Doctrine DBAL组件的数据迁移组件。集成于Laravel,Symfony等主流框架。大概可以分为两种方式进行迁移,即版本管理方式和diff方式。
版本管理:把数据库变更写入到代码中,来进行版本管理。Laravel框架就是版本管理的模式,迁移组件默认的命令行就是支持这种模式。
diff:把现有数据库结构和代码里面的数据库结构来做对比,执行差异的sql以保证一致性。一般需要ORM的支持,Symfony框架就是使用Doctrine2ORM工具加上Doctrine DBAL来进行diff方式的数据迁移。
此系列文章不讨论现有框架中数据迁移组件的使用,而是着重于探讨如何多带带使用迁移组件以及如何把数据迁移组件集成到自己的项目、个性化定制。
安装composer安装
composer require doctrine/migrations ~1.8.0
本系列使用的是目前最新的1.8.1版本配置
安装之后不能直接使用,还需要进行组件配置以及数据库配置:
根目录下建立migrations.php文件,配置组件:
return [ "name" => "Doctrine Migrations", // 组件显示名称 "migrations_namespace" => "dbmigrations", // 迁移类的命名空间 "table_name" => "migration_versions", // 迁移组件的表名 "migrations_directory" => "db/migrations", // 迁移类的文件夹 ];
详情的配置参数参见官方文档。
根目录下简历migrations-db.php文件,配置数据库信息:
return [ "driver" => "pdo_mysql", "host" => "localhost", "port" => 3306, "user" => "root", "password" => "1236", "dbname" => "migrations", ];
到此,组件需要的配置已经完成。
使用
运行vendor目录下面的命令生成版本迁移类文件。
./vendor/bin/doctrine-migrations migrations:generate
在迁移类目录/db/migrations下面生成Version20180608155932.php类文件,此文件即是用于写入迁移sql的类,Version后面的数字则是当前版本号。
重写up方法,用于执行迁移sql:
public function up(Schema $schema): void { $table = $schema->createTable("test1"); $table->addColumn("id", "integer")->setUnsigned(true)->setAutoincrement(true); $table->addColumn("name", "string")->setDefault("")->setLength(20); $table->setPrimaryKey(["id"]); }
这个脚本是生成一个test1的表。
重写down方法,用于版本回退,撤销up方法的迁移操作:
public function down(Schema $schema): void { if ($schema->hasTable("test1")) { $schema->dropTable("test1"); } }
执行迁移命令:
./vendor/bin/doctrine-migrations migrations:migrate
这样就成功的创建了一个版本的迁移数据。迁移类脚本可以使用$schema来操作数据库实体,也可以使用$this->addSql()方法来直接写入相关的sql,详细参加官方文档对于脚本编写的详细说明,此处不过多展开。
版本管理既然迁移使用版本管理,那么多个版本之间可以来回切换。下面是相关的版本切换命令:
./vendor/bin/doctrine-migrations migrations:migrate 20180608161758
这条命令是恢复到20180608161758版本,除了直接输入具体版本号之外,还有更加方便的版本别名:
first:回退到初始版本
prev:回到上一个版本
next:迁移到下一个版本
latest:迁移到最新版本(和不加版本号效果一样)
常用命令# 生成迁移脚本 php migration.php migrations:generate # 执行迁移到最新版本 php migration.php migrations:migrate # --dry-run是空转参数,只显示操作结果,不执行修改 php migration.php migrations:migrate --dry-run # 不执行操作,只写入文件,对于生产环境需要手动验证并执行的场景有用 php migration.php migrations:migrate --write-sql=file.sql # 查看详细信息 php migration.php status结语
到此,就学会了migrations组件的基本使用,但是还有如下几个问题需要我们解决:
一般项目中都会有数据库配置文件,如何让组件公用项目中的配置文件?
现在迁移组件所需要的配置文件只能在根目录,如何让配置文件更合理的归档?
命令行又长又难记,如何简单使用命令行?
下一章,我们会解决以上问题,并且让组件更个性化的融入到我们自己的项目中去。
在我的代码库可以查看这篇文章的详细代码。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28781.html
摘要:结语到此,数据迁移组件就已经很灵活的集成到我们自己的项目中了,而且你还可以根据自己的项目灵活修改自定义命令脚本文件。但是如果使用久了会发现现在的数据迁移会有两个问题不支持类型,在相关中,官方开发人员有回复所以只能添加自定义类型。 自定义命令脚本 目录结构 目前的项目结构是这样的(参照代码库): showImg(https://segmentfault.com/img/remote/14...
摘要:自定义根据官方文档,新建类,集成,并重写,,,等方法。如果集成迁移组件的时候数据库里已经存在表且有类型的字段,那么执行迁移命令时就会报错。下一章我们来详细研究如何集成方式的数据迁移组件。 自定义type 根据官方文档,新建TinyIntType类,集成Type,并重写getName,getSqlDeclaration,convertToPHPValue,getBindingType等方...
摘要:安全生成安全的随机数,加密数据,扫描漏洞的库一个兼容标准的过滤器一个生成随机数和字符串的库使用生成随机数的库一个安全库一个纯安全通信库一个简单的键值加密存储库一个结构化的安全层一个试验的面向对象的包装库一个扫描文件安全的库 Security 安全 生成安全的随机数,加密数据,扫描漏洞的库 HTML Purifier-一个兼容标准的HTML过滤器 RandomLib-一个生成随机数和字...
摘要:安全生成安全的随机数,加密数据,扫描漏洞的库一个兼容标准的过滤器一个生成随机数和字符串的库使用生成随机数的库一个安全库一个纯安全通信库一个简单的键值加密存储库一个结构化的安全层一个试验的面向对象的包装库一个扫描文件安全的库 Security 安全 生成安全的随机数,加密数据,扫描漏洞的库 HTML Purifier-一个兼容标准的HTML过滤器 RandomLib-一个生成随机数和字...
阅读 3701·2021-11-11 11:00
阅读 2179·2021-10-08 10:05
阅读 2670·2021-10-08 10:04
阅读 3203·2021-09-30 09:48
阅读 3761·2021-09-27 14:10
阅读 1703·2021-09-09 09:33
阅读 2098·2019-08-30 15:55
阅读 1601·2019-08-30 13:53