datingvip/php-mongo-migrator

MongoDB 迁移工具

1.0.2 2020-02-14 20:25 UTC

This package is auto-updated.

Last update: 2024-09-23 20:28:16 UTC


README

基于 PHPMongo ODM 的 MongoDB 迁移工具

Build Status Daily Downloads Latest Stable Version Coverage Status Gitter

MongoDb 中不需要模式,因此我们不需要创建数据库、集合或修改它们。但是,在某些情况下,无模式数据库需要迁移

  • 创建具有特殊参数的集合,例如带 caps 的集合;
  • 重命名或删除集合;
  • 创建、重命名或删除字段;
  • 创建、更改或删除索引;

要求



安装

通过 composer 本地安装

composer require sokil/php-mongo-migrator

安装后,您可以通过运行 ./vendor/bin/mongo-migrator 命令在控制台运行命令。

使用 phive 安装

phive install sokil/php-mongo-migrator

与 PHP 7 的兼容性

PHPMongo 目前基于旧的 ext-mongo 扩展。要使用此 ODM 与 PHP 7,您需要添加 兼容层,该兼容层在新的 ext-mongodb 上实现了旧扩展的 API。要开始使用 PHPMongo 与 PHP7,请将需求 alcaeus/mongo-php-adapter 添加到 composer。您可以在原始适配器的 已知问题 中阅读使用兼容层时 ODM 的限制。

您需要要求适配器

composer require alcaeus/mongo-php-adapter

使用方法

$ ./mongo-migrator
Console Tool

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  create    Create new migration
  help      Displays help for a command
  init      Initialize migrations project
  list      Lists commands
  migrate   Migrate to specific revision of database
  rollback  Rollback to specific version of database
  status    Show status of migrations

迁移初始化

每个命令都在放置 composer.json 和 vendor 目录的项目根目录中运行。首先,我们需要创建一个新的迁移项目。要做到这一点,转到项目根目录并运行

vendor/bin/mongo-migrator init

这将创建配置文件 mongo-migrator.yaml 和目录 "./migrations",其中放置迁移。您还可以使用 php 配置而不是 yaml。只需使用 php 配置格式初始化您的项目即可

vendor/bin/mongo-migrator init --configFormat=php

您可以显式指定配置文件和迁移目录的路径

vendor/bin/mongo-migrator init --configuration=confins/monfo-migrations.yaml --migrationDir=../migrations/mongo

如果迁移目录定义为相对路径,则它指向存储配置的目录。在上面的示例中,迁移目录将是 confins/../migrations/mongo

配置

配置格式

YAML 配置文件位于文件 "./mongo-migrator.yaml" 中。PHP 具有相同的结构。

default_environment: development

path:
    migrations: migrations
    
environments:
    development:
        dsn: mongodb://localhost
        
        default_database: test
        
        log_database: test
        log_collection: migrations
    
    staging:
        dsn: mongodb://localhost
        
        default_database: test
        
        log_database: test
        log_collection: migrations
    
    production:
        dsn: mongodb://localhost
        
        default_database: test
        
        log_database: test
        log_collection: migrations

环境是一组配置参数的集合,为具体位置定义,例如开发机器、测试或生产服务器。

  • default_environment - 一些命令需要知道它们执行的环境。此参数定义了如果未指定环境,则使用哪个环境。

  • path.migrations - 迁移脚本所在的迁移目录的路径。

  • environments - 环境配置部分。

每个环境都有以下参数

  • environments.*.dsn - 用于连接到 mongo 服务器的 DSN

  • environments.*.connectOptions - MongoClient 的选项,如 \MongoClient PHP 手册 中所述

  • environments.*.default_database - 如果在迁移脚本中未指定数据库,则使用的数据库

  • environments.*.log_database - 数据库,用于存储迁移日志

  • environments..log_collection - 数据库环境集合。.log_database 用于存储迁移日志

配置中的环境变量

任何值都可以从环境变量初始化

default_environment: common

path:
    migrations:  "%env(MONGO_MIGRATIONS_PATH)%"

environments:
    common:
        dsn: "%env(MONGO_DSN)%"
        default_database: "%env(MONGO_DEFAULT_DB)%"
        log_database: "%env(MONGO_LOG_DB)%"
        log_collection: "%env(MONGO_LOG_COLLECTION)%"

创建新版本

现在您可以创建迁移脚本。创建新版本

vendor/bin/mongo-migrator create revision_name

版本名称必须采用驼峰式格式。例如运行 vendor/bin/mongo-migrator create RevisionName。这将创建迁移脚本如 20151127093706_RevisionName.php,其中 "20151127093706" 是版本 ID,"RevisionName" 是版本名称。

pc:~/php-mongo-migrator$ ./bin/mongo-migrator create RevisionName
New migration created at ~/php-mongo-migrator/migrations/20151127093706_RevisionName.php

类来源

<?php

class RevisionName extends \Sokil\Mongo\Migrator\AbstractMigration
{
    public function up()
    {
        
    }
    
    public function down()
    {
        
    }
}

方法 up() 包含迁移过程中执行的命令,down() - 在回滚时执行。

现在您可以编写迁移和回滚的代码。

迁移状态

如果您想查看已存在版本的列表及其迁移状态,请运行

vendor/bin/mongo-migrator status [-e|--environment environment=ENVIRONMENT] [-c|--configuration=CONFIGURATION] [-l|--length=LENGTH]

如果版本状态是 "up",表示版本已应用,否则状态为 "down"。

 Revision        Status  Name            
-----------------------------------       
 20140607165612  down    Test2           
 20140607141237  up      Test1           
 20140607132630  up      RevisionName

选项 configuration 允许指定项目配置的路径,如果它不同于默认路径。选项 length 允许限制列表中的元素数量。

迁移和回滚

您可以迁移和回滚到任何可用的版本。迁移的命令

vendor/bin/mongo-migrator migrate  [-r|--revision revision] [-e|--environment environment] [-c|--configuration configuration]

如果没有指定版本,迁移将进行到最新版本。

选项 configuration 允许指定项目配置的路径,如果它不同于默认路径。

回滚的命令

vendor/bin/mongo-migrator rollback [-r|--revision revision] [-e|--environment environment] [-c|--configuration configuration]

如果没有指定版本,回滚将进行到上一个版本。

选项 configuration 允许指定项目配置的路径,如果它不同于默认路径。

编写迁移脚本

通过方法 AbstractMigration::getDatabase 和 AbstractMigration::getCollection,从迁移脚本中可以访问数据库和集合。方法 AbstractMigration::getCollection 获取默认数据库的集合,默认数据库在
配置的 "environments.*.default_database" 参数中定义。

有关数据库和集合类的文档可在 https://github.com/sokil/php-mongo 中找到。

<?php

class RevisionName extends \Sokil\Mongo\Migrator\AbstractMigration
{
    protected function init() 
    {
        // some common code
    }
    
    public function up()
    {
        $collection = $this
            ->getDatabase('some_database')
            ->getCollection('come_collection');

        // create new field in all documents of collection
        $collection->updateAll(function($operator) {
            $operator->set('newField', 'defaultValue')
        });
    }
    
    public function down()
    {
        $collection = $this
            ->getDatabase('some_database')
            ->getCollection('come_collection');

        // create new field in all documents of collection
        $collection->updateAll(function($operator) {
            $operator->unsetField('newField')
        });
    }
}

构建 Phar

  1. 使用 https://github.com/box-project/box2 中的手册安装 box。它必须以 box 的形式可访问。

  2. 检查是否已安装并可通过 PATH 访问 composer

  3. 您可以通过三种模式构建 Phar:未签名版本、由 OPENSSH 签名(用于运行时的自测试)和由 GPG 签名(通过 phive 安装)

3.1) 要构建未签名版本,只需运行 make

make

3.2) 要构建由 OPENSSH 签名的 Phar,您需要有自己的私钥。将其复制到 ./keys/private.pem 或生成一个新的私钥

# Generate new one:
openssl genrsa -des3 -out private.pem 4096
# If you want to remove passphrase
openssl rsa -in private.pem -out private.pem
# generate public
openssl rsa -in private.pem -outform PEM -pubout -out public.pem

然后构建 Phar

make openssh-signed

3.3) 要为 phive 构建由 GPG 签名的 Phar,您需要将私钥放置在 ./keys/private.ask

gpg --gen-key
gpg --export-secret-keys your@mail.com > keys/private.asc

然后构建 GPG 签名的 Phar

make gpg-signed

您可以使用公钥验证 Phar

$ gpg --verify mongo-migrator.phar.asc mongo-migrator.phar
gpg: Signature made чт, 22-лис-2018 23:27:46 +0200 EET
gpg:                using RSA key F530929F7ED528F0
gpg:                issuer "dmytro.sokil@gmail.com"
gpg: Good signature from "Dmytro Sokil <dmytro.sokil@gmail.com>" [ultimate]

您可以通过定义 MONGO_DRIVER 环境变量为旧版和新版驱动程序构建 Phar

make gpg-signed MONGO_DRIVER=new
make gpg-signed MONGO_DRIVER=legacy

如果未传递 MONGO_DRIVER 环境变量,则 make 将尝试自动检测您的驱动程序。

开发

要启动 docker 中的开发环境,请运行

./run-docker-cli.sh

要使用 xdebug,请配置您的 IDE 以使用端口 9001。

有一个沙盒可以测试命令

cd /phpmongo/tests/
export PHPMONGO_DSN="mongodb://mongodb32"; ../bin/mongo-migrator -vvv status -l 4 -e docker

单元测试

本地测试

composer.phar test

Docker 测试

./run-docker-tests.sh