场景分析团队开发,每个开发人员必须手动记录数据库的所有变更,上线时需要人工整理,运维成本非常高。而且,多个开发者之间的数据结构同步也是一个大问题。DoctrineMigrations组件在代码中加入了数据库变更,并与代码一起进行版本管理,很好的解决了上述问题。DoctrineMigrations是基于DoctrineDBAL组件的数据迁移组件。集成到Laravel和Symfony等主流框架中。大致可以分为两种方式进行迁移,即版本管理方式和diff方式。版本管理:将数据库变更写入代码进行版本管理。Laravel框架是一种版本管理模式,迁移组件默认的命令行支持这种模式。diff:将已有的数据库结构与代码中的数据库结构进行比较,执行不同的SQL,保证一致性。一般需要ORM支持,Symfony框架使用Doctrine2ORM工具加DoctrineDBAL以diff方式进行数据迁移。本系列文章不讨论现有框架中数据迁移组件的使用,而是着重介绍如何单独使用迁移组件,以及如何将数据迁移组件集成到自己的项目中并进行个性化设置。安装composer安装composerrequiredoctrine/migrations~1.8.0本系列使用最新版本1.8.1。配置安装后不能直接使用,还需要组件配置和数据库配置:在根目录下创建一个migrations.php文件,配置组件:return['name'=>'DoctrineMigrations',//组件显示名称'migrations_namespace'=>'db\migrations',//迁移类的命名空间'table_name'=>'migration_versions',//迁移组件的表名'migrations_directory'=>'db/migrations',//的文件夹迁移类];详细配置参数见官方文档。恢复根目录下的migrations-db.php文件,配置数据库信息:return['driver'=>'pdo_mysql','host'=>'localhost','port'=>3306,'user'=>'root','password'=>'1236','dbname'=>'迁移',];至此,组件所需的配置已经完成。在vendor目录下运行命令,生成版本迁移类文件。./vendor/bin/doctrine-migrationsmigrations:generate在迁移类目录/db/migrations下生成Version20180608155932.php类文件。这个文件就是用来写迁移sql的class,Version后面的数字就是当前的版本号。重写up方法执行迁移sql:publicfunctionup(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方法的迁移操作:publicfunctiondown(Schema$schema):void{if($schema->hasTable('test1')){$schema->dropTable('test1');}}执行迁移命令:./vendor/bin/doctrine-migrationsmigrations:migrate这样就成功创建了一个版本的迁移数据。迁移脚本可以使用$schema来操作数据库实体,也可以使用$this->addSql()方法直接编写相关的sql。脚本编写的详细说明可以参考官方文档,这里就不展开了。版本管理由于迁移使用版本管理,多个版本可以来回切换。以下是相关的版本切换命令:./vendor/bin/doctrine-migrationsmigrations:migrate20180608161758该命令恢复到20180608161758版本。除了直接输入具体版本号外,还有一个更方便的版本别名:first:back回到初始版本prev:回到上一个版本next:迁移到下一个版本latest:迁移到最新版本(效果和没有版本号一样)常用命令#生成迁移脚本phpmigration.phpmigrations:generate#执行迁移到最新版本的phpmigration.phpmigrations:migrate#--dry-run是一个空闲参数,它只显示操作结果,不做修改。需要在生产环境中手动验证和执行的场景很有用。有以下几个问题需要我们解决:一般项目中都会有数据库配置文件,组件的公共项目中的配置文件如何制作?现在迁移组件需要的配置文件只能在根目录下,如何更合理的对配置文件进行归档?命令行又长又难记,如何轻松使用命令行?在下一章中,我们将解决上述问题,将更加个性化的组件融入到我们自己的项目中。您可以在我的代码库中查看本文的详细代码。
