[Doctrine Migrations] 数据库迁移组件的深入解析一:安装与使用
场景分析
团队开发中,每个开发人员对于数据库都修改都必须手动记录,上线时需要人工整理,运维成本极高。而且在多个开发者之间数据结构同步也是很大的问题。Doctrine Migrations
组件把数据库变更加入到代码中和代码一起进行版本管理,很好的解决了上述问题。
Doctrine Migrations
是基于Doctrine DBAL
组件的数据迁移组件。集成于Laravel,Symfony等主流框架。大概可以分为两种方式进行迁移,即版本管理方式和diff方式。
版本管理:把数据库变更写入到代码中,来进行版本管理。Laravel框架就是版本管理的模式,迁移组件默认的命令行就是支持这种模式。
diff:把现有数据库结构和代码里面的数据库结构来做对比,执行差异的sql以保证一致性。一般需要ORM的支持,Symfony框架就是使用Doctrine2
ORM工具加上Doctrine DBAL
来进行diff方式的数据迁移。
此系列文章不讨论现有框架中数据迁移组件的使用,而是着重于探讨如何单独使用迁移组件以及如何把数据迁移组件集成到自己的项目、个性化定制。
安装
composer安装
composer require doctrine/migrations ~1.8.0
本系列使用的是目前最新的1.8.1版本
配置
安装之后不能直接使用,还需要进行组件配置以及数据库配置:
根目录下建立migrations.php文件,配置组件:
return [
'name' => 'Doctrine Migrations', // 组件显示名称
'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' => '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组件的基本使用,但是还有如下几个问题需要我们解决:
- 一般项目中都会有数据库配置文件,如何让组件公用项目中的配置文件?
- 现在迁移组件所需要的配置文件只能在根目录,如何让配置文件更合理的归档?
- 命令行又长又难记,如何简单使用命令行?
下一章,我们会解决以上问题,并且让组件更个性化的融入到我们自己的项目中去。
在我的代码库可以查看这篇文章的详细代码,欢迎star。
[Doctrine Migrations] 数据库迁移组件的深入解析一:安装与使用的更多相关文章
- [Doctrine Migrations] 数据库迁移组件的深入解析四:集成diff方式迁移组件
场景及优势 熟悉Symfony框架之后,深刻感受到框架集成的ORM组件Doctrine2的强大之处,其中附带的数据迁移也十分方便.Doctrine2是使用Doctrine DBAL组件把代码里面的表结 ...
- [Doctrine Migrations] 数据库迁移组件的深入解析二:自定义集成
自定义命令脚本 目录结构 目前的项目结构是这样的(参照代码库): 其中,db/migrations文件夹是迁移类文件夹,config/db.php是我们项目原有的db配置,migrations.php ...
- [Doctrine Migrations] 数据库迁移组件的深入解析三:自定义数据字段类型
自定义type 根据官方文档,新建TinyIntType类,集成Type,并重写getName,getSqlDeclaration,convertToPHPValue,getBindingType等方 ...
- MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求
MVC5中Model层开发数据注解 ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证( ...
- EFCodeFirst Migrations数据库迁移
EFCodeFirst Migrations数据库迁移 数据库迁移 1.生成数据库 修改类文件PortalContext.cs的静态构造函数,取消当数据库模型发生改变时删除当前数据库重建新数据库的设置 ...
- EF Code First Migrations数据库迁移
1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...
- C# EF Code First Migrations数据库迁移
1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...
- EF Code First Migrations数据库迁移 (转帖)
1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...
- 【EF】EF Code First Migrations数据库迁移
1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...
随机推荐
- Android学习——BroadCast(一)
初识广播 BroadCast即为广播,为安卓四大组件之一,用于在应用程序和Activity间传输信息.一条广播,分为发送和接收两部分,发送方通过Intent存储信息,并进行发送.接收方通过BroadC ...
- ubuntu安装最新版node和npm
1.先在系统上安装好nodejs和npm sudo apt-get install nodejs-legacy sudo apt-get install npm 2.升级n ...
- 动态给table添加动态航
<html> <head> <title>usually function</title> <meta http-equiv="Cont ...
- hiredis
hiredis是redis开源库对外发布的客户端API包. 当redis-server配置启动后,可以通过hiredis操作redis资源. 主要分为: strings.hash.lists.sets ...
- Maven项目打包jar依赖外部jar
有时候我们想要做一些java 的小程序,需要把打包成jar,单独执行,做一个maven项目,maven非常方便,有自动打包成jar的插件,但是有时候我们的项目可能会依赖其他的jar包,所以非常麻烦. ...
- linux shell数据重定向
标准输入 (stdin) :代码为 0 ,使用 < 或 << :标准输出 (stdout):代码为 1 ,使用 > 或 >> :标准错误输出(stderr):代码为 ...
- 【bootstrap】插件
1.bootstrap.js 和 bootstrap.min.js 都包含了所有的插件. 2.命名空间:即域:域内成员的有效范围.超出范围就是无效. 3.通过 data 属性 API 就能使用所有的 ...
- 理解JavaScript对象
理解JavaScript对象 对象是JavaScript的基本数据类型.对象是一种复合值:将很多值(原始值或者其他对象)聚合在一起. JavaScript对象不仅可以保持自有的属性,还可以从原型对象继 ...
- supervisord的安装
作用: 用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制. 安装流程 ...
- C# Path类 FileStream(文件流) 与 File(文件) 读取的区别
1.采用文件流读取数据是一点一点从文件中读取数据对内存的压力相对较小;而采用文件读取数据是一下全部读取过来对内存造成的压力相对较大 2.File读取: string str = @"E:\Q ...