mvrhov/migratum

模板化数据库迁移

dev-master / 0.5.x-dev 2018-02-01 07:50 UTC

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

安装 & 运行

  1. 安装Composer

    curl -sS https://getcomposer.org/installer | php
    
  2. 使用Composer将Migratum作为依赖项

    php composer.phar require mvrhov/migratum
    
  3. 执行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