sokil/php-mongo-migrator

1.0.2 2020-02-14 20:25 UTC

This package is auto-updated.

Last update: 2024-09-03 10:59:27 UTC


README

SWUbanner

PHPMongo Migrator

基于PHPMongo ODM的MongoDB迁移

Daily Downloads Latest Stable Version Coverage Status Gitter

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

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

要求



安装

通过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 - 数据库 environments 的集合,其中 environments..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. 使用手册安装 box,网址为 https://github.com/box-project/box2。它必须作为 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 环境变量为 legacy 和新驱动程序构建 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