datingvip / php-mongo-migrator
MongoDB 迁移工具
Requires
- php: >=5.6 || ^7.0
- sokil/php-mongo: 1.*
- symfony/console: >=2.0 <6.0
- symfony/yaml: >=2.0 <6.0
Requires (Dev)
- phpunit/phpunit: >=3.7.38 <6.0
- satooshi/php-coveralls: >=0.7.1 <3.0
- squizlabs/php_codesniffer: ^3
Suggests
- alcaeus/mongo-php-adapter: Adapter to provide ext-mongo interface on top of mongo-php-library
- phpmongokit/yii2-mongo-odm: Yii2 Framework component
- sokil/php-mongo-bundle: Symfony Bundle
- sokil/php-mongo-yii: Yii Framework component
README
基于 PHPMongo ODM 的 MongoDB 迁移工具
MongoDb 中不需要模式,因此我们不需要创建数据库、集合或修改它们。但是,在某些情况下,无模式数据库需要迁移
- 创建具有特殊参数的集合,例如带 caps 的集合;
- 重命名或删除集合;
- 创建、重命名或删除字段;
- 创建、更改或删除索引;
要求
- PHP 5
- 从 2018-10-19 开始不支持 PHP 5.3
- PHP 5.4 - PHP 5.6
- PHP Mongo 扩展 0.9 或更高版本(某些功能需要 >= 1.5)
- PHP 7
- PHP MongoDB 扩展 1.0 或更高版本
- 兼容层. 请注意,有一些 限制
- HHVM
- HHVM 驱动 不支持.
安装
通过 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
-
使用 https://github.com/box-project/box2 中的手册安装 box。它必须以
box
的形式可访问。 -
检查是否已安装并可通过 PATH 访问
composer
-
您可以通过三种模式构建 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