[Doctrine Migrations] 数据库迁移组件的深入解析一:安装与使用
场景分析
团队开发中,每个开发人员对于数据库都修改都必须手动记录,上线时需要人工整理,运维成本极高。而且在多个开发者之间数据结构同步也是很大的问题。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' => '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 ...
随机推荐
- python完全学习笔记
dir(__builtins__) help(input) 'let\'s go' #转义字符 \ r'c:\now' #字符串前加r 自动转义 str= ''' shdiufhi s ...
- Tomcat的运行模式
tomcat的三种运行模式 tomcat Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下: 这三种模式的不同之处如下: ●BIO: 一个线程处理一个请求.缺 ...
- OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四种复制方式-单层文件夹复制
字节流两套: java.lang.Object--java.io.OutputStream--java.io.FileOutputStream java.lang.Ob ...
- javascript 获取文档/屏幕的Width||Height
document.body.clientWidth //网页可见区域宽度document.body.clientHeight //网页可见区域高度document.body.offsetWidth / ...
- 使用CoreImage教程
使用CoreImage教程 CoreImage包含有很多实用的滤镜,专业处理图片的库,为了能看到各种渲染效果,请使用如下图片素材. 现在可以开始教程了: #define FIX_IMAGE(image ...
- 关于NativeEvent的处理
nativeEvent(const QByteArray &eventType, void *message, long *result){ chASSERT(message != NULL) ...
- js函数 标签: javascript 2016-08-12 16:48 56人阅读 评论(0) 收藏
函数实际上是对象,函数名实际上也是一个指向函数对象的指针. 使用不带圆括号的函数名是访问函数指针,而非调用函数. 函数声明和函数表达式: alert(test(2,3)); function test ...
- React Native调试技巧与心得
转自:http://blog.csdn.net/quanqinyang/article/details/52215652 在做React Native开发时,少不了的需要对React Native程序 ...
- Maven项目打包jar依赖外部jar
有时候我们想要做一些java 的小程序,需要把打包成jar,单独执行,做一个maven项目,maven非常方便,有自动打包成jar的插件,但是有时候我们的项目可能会依赖其他的jar包,所以非常麻烦. ...
- UML用例图间关系说明
用例间一般存在如下四种关系: 1."通信"关系(<<cmmunicate>>构造型): "通信"关系:使用实心的关联线或带<< ...