sokil / 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 Migrator
基于PHPMongo ODM的MongoDB迁移
MongoDb中不需要模式,因此我们不需要创建数据库、集合或修改它们。但是,在某些情况下,在无模式的数据库中也需要迁移
- 创建具有特殊参数的集合,例如带标记的集合;
- 重命名或删除集合;
- 创建、重命名或删除字段;
- 创建、更改或删除索引;
要求
- 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 - 数据库 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
-
使用手册安装 box,网址为 https://github.com/box-project/box2。它必须作为
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
环境变量为 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