kapcus / dbchanger
数据库变更安装工具包
Requires
- php: >=5.6
- dibi/dibi: ^3.1
- doctrine/orm: 2.5.*
- nette/di: ^2.3
- nette/finder: ^2
README
高级数据库变更管理工具包。
- 集中部署和安装
- 多环境、多模式和用户
- 每个dbChange可以有多个SQL文件和任意占位符
- 简单的环境配置
- 每个dbChange可以定义多个其他所需的dbChange
当前支持的数据库
ORACLE
架构
环境
可以分配给多个用户
,并可以定义多个占位符
DbChange
由片段组成。片段
是一组在一个SQL文件中定义的SQL查询 - SQL内容更像模板- 每个DbChange都可以在环境中安装,这表示为安装。
安装
可以是成功的,取消的,但总是同时只有一个活动安装。每个安装由安装片段组成。安装片段
是针对特定环境和用户修改的特定片段的SQL内容。其标识符以字母F开头,例如F10
DbChange 12345
有自己的目录。它由10个片段组成。因此有10个文件
每个文件名遵循格式XXXXXX_YYYYYYY_ZZZZZZZ.sql
,其中
XXXXXX
是可选的,可以作为文件前缀,在我们的例子中是空的(例如dbchange_)YYYYYY
是片段索引编号,必须是数字且递增,用字母I标识(例如I5)ZZZZZZ
是组名
文件_requirements.txt可以包含必需安装在此dbChange之前安装的dbChange列表。每行一个dbChange代码。空或缺失的文件表示dbChange不需要安装任何dbChange。
每个片段内容在事务角度上必须是原子的。例如,Oracle不支持回滚DDL语句,因此所有这些查询必须在自己的单独文件中。
可以在每个环境的config.local.neon
文件中定义组,例如。
central: [MAINUSER]
- 表示具有组central
的片段SQL内容将为主用户执行region: [SLAVEUSER1, SLAVEUSER2]
表示具有组region
的片段SQL内容将为SLAVEUSER1执行,也将为用户SLAVEUSER2执行
用户可以定义任意数量的组,并将任意数量的用户分配到每个组中。
在片段SQL内容中可以使用占位符
。处理引擎简单地将占位符替换为配置文件中定义的值,该文件是要替换的。
组名也可以用作占位符。结果是,将为分配给组中的每个用户插入一行SQL代码,占位符值将替换为用户名。
使用以下表示法
I1
=安装
ID为1F2
=安装片段
ID为2X3
=片段索引
ID为3L4
=安装日志
ID为4
可用的安装状态
N
=新
- 初始状态,表示安装可以开始P
=挂起
- 状态表示至少存在一个挂起的安装片段I
=已安装
- 所有安装片段都成功安装C
=已取消
- 所有安装片段都被取消
可用的安装片段状态
N
=新
- 初始状态,表示安装片段已准备好安装P
=挂起
- 状态表示该安装片段的安装已经开始,但发生了一些错误I
=已安装
- 安装片段已成功安装S
=跳过
- 安装片段已被跳过C
=已取消
- 安装片段已被取消
安装
1] 使用以下命令安装DbChanger及其所有必需依赖项
composer require kapcus/dbchanger
2] 运行位于 build 文件夹中的sql脚本。这将安装DbChanger内部数据库表。(您需要能够创建表、触发器、序列,请参阅 grants.sql)
3] 将 config.local.neon.example 移动到 dbchanger/config.local.neon
并设置dbchanger.database部分(这里将运行中央DbChanger逻辑的数据库)。
4] 运行此命令以验证DbChanger是否已正确安装和配置
php bin/console.php dbchanger:check
使用方法
1] 在 dbchanger/config.local.neon
中定义您的环境。
========================================
2] 使用以下命令初始化DbChange
php bin/console.php dbchanger:init
此命令将配置文件中指定的环境数据加载到内部DbChanger数据库中。现在,DbChanger与您的配置保持一致,并准备提供服务。
========================================
3] 使用以下命令注册dbChange(例如,12345)
php bin/console.php dbchanger:register 12345
php bin/console.php dbchanger:register 12345 -d
php bin/console.php dbchanger:register 12345 -o
此命令将dbChange文件的sql内容加载到内部DbChanger数据库中。现在,dbChange已准备好在所选环境中安装。
如果指定了 -d
(调试),则忽略文件 _requirements.txt
中指定的所有依赖DbChange。这在开发期间非常有用,当开发者需要测试特定DbChange及其依赖项不重要时。
如果指定了 -o
(覆盖),则现有DbChange(如果有的话)将被覆盖 - 这仅在没有任何挂起的该DbChange安装时才可能。
在 config.neon 中指定的 inputDirectory
中搜索源dbChange内容
========================================
4] 使用以下命令安装dbChange(例如,12345)
php bin/console.php dbchanger:install DEV 12345
php bin/console.php dbchanger:install DEV 12345 -s
php bin/console.php dbchanger:install DEV 12345 -f
此命令将与指定用户的环境建立连接。一旦连接,它将逐个执行所选dbChange的sql查询。安装逐个处理片段,并通过适当的安装片段状态确认此操作。一旦整个dbChange安装成功安装,将设置正确的安装状态。
如果指定了 -s
(停止),则安装将在开始时停止(在需要跳过第一个片段时很有用)
如果指定了 -f
(强制),则将忽略确保所有必需DbChange都最新的约束(即安装了最新版本)
所有执行的查询都记录在 config.neon 中指定的 logDirectory
========================================
其他功能
DbChanger可以显示安装状态,并列出所有安装片段及其特定属性(例如,显示在DEV环境中dbChange 12345的安装状态)
php bin/console.php dbchanger:status DEV 12345
同时列出特定DbChange的所有注册版本。
========================================
如果安装失败或需要手动安装组,则需要手动交互。在安装过程中,DbChanger将识别此状态并报告。一旦手动执行或修复,必须通知DbChanger问题已解决。以下命令可以更改dbChange片段的状态(例如,将片段F3的状态更改为INSTALLED,将片段F3、F4和F5的状态更改为CANCELLED,整个安装的状态更改为NEW)。
php bin/console.php dbchanger:mark F3 I
php bin/console.php dbchanger:mark F3-F5 C
php bin/console.php dbchanger:mark I1 N
========================================
命令log
可用于显示指定已安装片段的安装日志历史。
php bin/console.php dbchanger:log F5
========================================
命令display
对于显示已安装片段的SQL内容或安装日志条目非常有用。
php bin/console.php dbchanger:display F5
php bin/console.php dbchanger:display L10
========================================
将dbChange或单个片段的内容导出到文件也是有用的。例如,在手动dbChange的情况下,SQL只能由单独的进程执行。以下命令将为环境DEV、dbChange 12345和索引为7的片段生成最终SQL内容。输出文件夹可以在配置文件中指定。
php bin/console.php dbchanger:generate DEV 12345
php bin/console.php dbchanger:generate DEV 12345 X7
php bin/console.php dbchanger:generate DEV 12345 X7 -d
如果指定了-d
,则输出将输出到标准输出。
在config.neon中指定的inputDirectory
中搜索源dbChange内容。在config.neon中指定的outputDirectory
中存储生成的内容。
特殊的SQL片段类型
-
可以指定不同的分隔符(例如,在Oracle创建过程/触发器的情况下),只需添加注释
-- DELIMITER
,参见示例。 -
当需要替换组占位符时,可以只多次执行SQL查询的一部分。为此,请参见示例中
/*START*/
、/*END*/
、/*GLUE_START
和GLUE_END*/
的使用。
TODO
-
在源代码中添加注释
-
检查命令 - 检查所有连接,检查所有序列
-
重新初始化命令 - 当环境、组、用户更改/添加/删除时,反映此更改
-
回滚命令 - 添加对逆dbChange的支持并实现dbChange回滚
-
列表命令 - 列出可以注册的所有dbchange