场景分析

团队开发中,每个开发人员对于数据库都修改都必须手动记录,上线时需要人工整理,运维成本极高。而且在多个开发者之间数据结构同步也是很大的问题。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版本

配置

安装之后不能直接使用,还需要进行组件配置以及数据库配置:

  1. 根目录下建立migrations.php文件,配置组件:

    return [
    'name' => 'Doctrine Migrations', // 组件显示名称
    'migrations_namespace' => 'db\migrations', // 迁移类的命名空间
    'table_name' => 'migration_versions', // 迁移组件的表名
    'migrations_directory' => 'db/migrations', // 迁移类的文件夹
    ];

    详情的配置参数参见官方文档

  2. 根目录下简历migrations-db.php文件,配置数据库信息:

    return [
    'driver' => 'pdo_mysql',
    'host' => 'localhost',
    'port' => 3306,
    'user' => 'root',
    'password' => '1236',
    'dbname' => 'migrations',
    ];

到此,组件需要的配置已经完成。

使用

  1. 运行vendor目录下面的命令生成版本迁移类文件。

    ./vendor/bin/doctrine-migrations migrations:generate

    在迁移类目录/db/migrations下面生成Version20180608155932.php类文件,此文件即是用于写入迁移sql的类,Version后面的数字则是当前版本号。

  2. 重写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的表。

  3. 重写down方法,用于版本回退,撤销up方法的迁移操作:

    public function down(Schema $schema): void
    {
    if ($schema->hasTable('test1')) {
    $schema->dropTable('test1');
    }
    }
  4. 执行迁移命令:

    ./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组件的基本使用,但是还有如下几个问题需要我们解决:

  1. 一般项目中都会有数据库配置文件,如何让组件公用项目中的配置文件?
  2. 现在迁移组件所需要的配置文件只能在根目录,如何让配置文件更合理的归档?
  3. 命令行又长又难记,如何简单使用命令行?

下一章,我们会解决以上问题,并且让组件更个性化的融入到我们自己的项目中去。

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

[Doctrine Migrations] 数据库迁移组件的深入解析一:安装与使用的更多相关文章

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

    场景及优势 熟悉Symfony框架之后,深刻感受到框架集成的ORM组件Doctrine2的强大之处,其中附带的数据迁移也十分方便.Doctrine2是使用Doctrine DBAL组件把代码里面的表结 ...

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

    自定义命令脚本 目录结构 目前的项目结构是这样的(参照代码库): 其中,db/migrations文件夹是迁移类文件夹,config/db.php是我们项目原有的db配置,migrations.php ...

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

    自定义type 根据官方文档,新建TinyIntType类,集成Type,并重写getName,getSqlDeclaration,convertToPHPValue,getBindingType等方 ...

  4. MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求

    MVC5中Model层开发数据注解   ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证( ...

  5. EFCodeFirst Migrations数据库迁移

    EFCodeFirst Migrations数据库迁移 数据库迁移 1.生成数据库 修改类文件PortalContext.cs的静态构造函数,取消当数据库模型发生改变时删除当前数据库重建新数据库的设置 ...

  6. EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  7. C# EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  8. EF Code First Migrations数据库迁移 (转帖)

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  9. 【EF】EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

随机推荐

  1. androidwebview网页显示事件

    @Overridepublic void onPageCommitVisible(WebView view, String url) { super.onPageCommitVisible(view, ...

  2. c# BackGroundWorker 多线程操作的小例子 (转)

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

  3. svn merge error must be ancestrally related to,trunk merge branch报错

    trunk merge branch的时候报错 xxx must be ancestrally related to xxx,这个报错的意思是两者不关联,所以需要去建立关联. [回顾背景]       ...

  4. Virtualenv-windows

    1.下载 pip3 install virtualenv 2.创建虚拟化环境 3. 进入虚拟化目录 4.推出虚拟化环境 5.指定python版本 二.virtualenvwrapper的使用 1.下载 ...

  5. mysql8采用caching-sha2-password加密

    因为搭建docker容器mysql,直接pull mysql latest版本,因为目前mysql的版本已经升级到了8.0. 像我们之前链接mysql的方式,或者说客户端,就不行了. 比如navica ...

  6. 【Leetcode】【Medium】Search a 2D Matrix

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  7. .net 面向对象程序设计深入](2)UML

    1.用例图简介 定义:用例图主要用来描述“用户.需求.系统功能单元”之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. 类型:动态图 应用:需求分析阶段 2.用例图元素 2.1 参与者(Ac ...

  8. iframe加载顺序导致数据访问出现问题

    背景: 一个页面A内有一个iframe,src指向了B页面. 问题: 页面A通过Ajax获取服务器数据,并赋值给了页面A的全局变量gData,页面B要用到页面A的数据gData.那么问题来了当B访问g ...

  9. r.js压缩打包(require + backbone)项目开发文件

    最近项目稳定了一点,之前一直没空关注的开发文件压缩打包问题也有时间来解决了 AMD模块化开发中的代码压缩打包工具——r.js 环境搭建基于nodejs:用于AMD模块化开发中的项目文件压缩打包,不是A ...

  10. 【JAVA EE企业级开发四步走完全攻略】

    本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划,单个发blog比较零散,所以整理此索引,决定以后每发一季JAVA EE blog后会 ...