mvrhov / migratum
模板化数据库迁移
Requires
- php: >=7.1
- jdorn/sql-formatter: ^1.2
- league/container: ^3.0
- symfony/console: ^3.4|^4.0
- symfony/finder: ^3.4|^4.0
- twig/twig: ^2.4
This package is auto-updated.
Last update: 2024-09-22 20:17:37 UTC
README
简介
大多数PHP迁移工具都强迫你使用类和函数在PHP中编写迁移,这样你的数据库就是不可知的,但另一方面,你通常限于数据库支持的最低共同特征。使用Migratum,你可以直接在数据库特定的DDL中编写迁移。除此之外,你还可以将一些上下文传递给每个迁移。
大多数人认为,在DB特定DDL中拥有的迁移不允许你更改数据库,但让我们坦诚一点。几乎没有人决定平台后更改数据库。
特性
- 利用数据库提供的任何DDL & DML功能
- 将参数/上下文传递给迁移
- 为多个数据库提供者创建迁移,例如MySQL和PostgreSQL
- 迁移上和下
- 迁移挂起的上迁移
- 多个目录和/或命名空间中的迁移
- 多个环境
- 使用twig来
支持的适配器
Migratum原生支持以下数据库平台
- PostgreSQL
安装 & 运行
-
安装Composer
curl -sS https://getcomposer.org/installer | php
-
使用Composer将Migratum作为依赖项
php composer.phar require mvrhov/migratum
-
执行Migratum
php composer.phar install
命令
所有命令都有dry-run模式,您可以查看将要运行的内容。如果还提供-v
,您还可以查看将要执行的查询。
migratum:init
初始化migratum,通过创建默认配置文件
migratum:create
在某个命名空间中创建空迁移
bin/migratum migratum:create "create table account"
在默认命名空间 <current_timestamp>_create_table_account
中创建一个空迁移
bin/migratum migratum:create "create table foo" -s foo.1
在命名空间 foo
中创建一个名为 <current_timestamp>_create_table_foo
的空迁移
migratum:migrate
bin/migratum migratum:migrate
应用所有挂起的迁移,无论它们的命名空间如何
bin/migratum migratum:migrate -t <timestamp>
应用所有挂起的迁移,直到<timestamp>
,无论它们的命名空间如何
migratum:pending
有时当多个人在一个项目上工作时,可能会发生一些迁移是由其他人创建的,这些迁移夹在你的迁移之间。在这种情况下,您应该审查这些迁移,如果它们与您的迁移不冲突,那么您应该运行挂起命令。如果它们冲突,那么遗憾的是,进行适当迁移的唯一方法是回滚到该迁移,修复您的迁移,然后重新应用它们。
migratum:rollback
撤销一些已应用的迁移
bin/migratum migratum:rollback -b <count>
回滚到 <count>
次迁移的已应用迁移,无论版本如何
bin/migratum migratum:rollback -t <timestamp>
回滚到 <timestamp>
次迁移的已应用迁移
migratum:status
状态命令将报告数据库的当前状态。
迁移示例
- timestamps.sql.twig
{% macro timestamp_triggers(tableName) %} DROP TRIGGER IF EXISTS set_updated_at_{{ tableName }} ON {{ tableName }}; CREATE TRIGGER set_updated_at_{{ tableName }} BEFORE UPDATE ON {{ tableName }} FOR EACH ROW EXECUTE PROCEDURE set_updated_at_column(); {% endmacro timestamp_triggers %} {% macro drop_timestamp_triggers(tableName) %} DROP TRIGGER IF EXISTS set_updated_at_{{ tableName }} ON {{ tableName }}; {% endmacro drop_timestamp_triggers %}
- 20180110851900_create_default_triggers.sql.twig
{% block up %} -- @Migratum\QueryBlockStart CREATE OR REPLACE FUNCTION set_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = now(); RETURN NEW; END; $$ language 'plpgsql'; {% endblock up %} {% block down %} DROP FUNCTION set_updated_at_column; {% endblock down %}
- 20180111115900_create_account.sql.twig
{% block up %} {% import 'timestamps.sql.twig' as t %} {% set table = 'account' %} CREATE TABLE {{ table }} ( id_{{ table }} INTEGER GENERATED BY DEFAULT AS IDENTITY, name varchar(200) NOT NULL, email varchar(200) NOT NULL, enabled boolean NOT NULL, created_at timestamp DEFAULT now() NOT NULL, updated_at timestamp, PRIMARY KEY(id_{{ table }}) ); {{ t.timestamp_triggers(table) }} {% endblock up %} {% block down %} {% set table = 'account' %} {{ t.drop_timestamp_triggers(table) }} DROP TABLE {{ table }}; {% endblock down %}
注意事项
如果你仔细看上面的迁移,你会看到在创建触发器的迁移中存在特定的SQL注释。这个注释是必需的,因为Migratum会根据;
字符将迁移拆分成基于SQL语句的多个部分。当存在存储过程/触发器...基本上是一组多个SQL语句,或者存储过程/触发器...使用其中分号;
也是语句结束的语言时,这会成为一个问题。由于存在太多不同的方言,你必须用-- @Migratum\QueryBlockStart
标记不能拆分的部分。你可以在迁移中重复使用-- @Migratum\QueryBlockStart
,需要多少次就使用多少次。每个这样的标记都会开始一个新的非拆分语句。
如果你想退出非拆分语句模式,你应该添加以下SQL注释-- @Migratum\QueryBlockEnd
。