Phinx 使用许多命令运行。
断点命令用于设置断点,允许您限制回滚。您可以通过不提供任何参数来切换最新迁移的断点。
$ phinx breakpoint -e development
要在特定版本上切换断点,请使用 --target
参数或缩写 -t
。
$ phinx breakpoint -e development -t 20120103083322
您可以使用 --remove-all
参数或缩写 -r
来删除所有断点。
$ phinx breakpoint -e development -r
您可以使用 -set
或 --unset
在最新迁移(或与 --target
或 -t
参数结合使用时在特定迁移上)设置或取消设置(而不是仅仅切换)断点。
当您运行 status
命令时,断点可见。
创建命令用于创建一个新的迁移文件。它需要一个参数:迁移的名称。迁移名称应使用驼峰命名法指定。
$ phinx create MyNewMigration
在您的文本编辑器中打开新的迁移文件以添加您的数据库转换。Phinx 使用您在 phinx 配置文件中指定的路径创建迁移文件。有关更多信息,请参见配置一章。
您可以通过提供替代模板文件名来覆盖 Phinx 使用的模板文件。
$ phinx create MyNewMigration --template="<file>"
您也可以提供一个模板生成类。此类必须实现接口 Phinx\Migration\CreationInterface
。
$ phinx create MyNewMigration --class="<class>"
除了提供迁移模板之外,该类还可以定义一个回调函数,该函数将在从模板生成迁移文件后被调用。
您不能同时使用 --template
和 --class
。
初始化命令(缩写为初始化)用于为 Phinx 准备您的项目。此命令在您项目的根目录中生成 phinx 配置文件。默认情况下,此文件将被命名为 phinx.php
。
$ phinx init
您可以选择为 Phinx 的配置文件指定一个自定义位置
$ phinx init ./custom/location/
您还可以指定一个自定义文件名
$ phinx init custom-config.yml
以及与 php、yml 和 json 不同的格式。例如,要创建 yml 文件
$ phinx init --format yml
在您的文本编辑器中打开此文件以设置您的项目配置。有关更多信息,请参见配置一章。
迁移命令运行所有可用的迁移,可以选择运行到特定版本。
$ phinx migrate -e development
要迁移到特定版本,请使用 --target
参数或缩写 -t
。
$ phinx migrate -e development -t 20110103081132
使用 --dry-run
将查询打印到标准输出而不执行它们
$ phinx migrate --dry-run
回滚命令用于撤消 Phinx 执行的先前迁移。它是迁移命令的反向操作。
您可以使用不带任何参数的 rollback
命令回滚到上一个迁移。
$ phinx rollback -e development
要将所有迁移回滚到特定版本,请使用 --target
参数或缩写 -t
。
$ phinx rollback -e development -t 20120103083322
指定 0 作为目标版本将还原所有迁移。
$ phinx rollback -e development -t 0
要将所有迁移回滚到特定日期,请使用 --date
参数或缩写 -d
。
$ phinx rollback -e development -d 2012
$ phinx rollback -e development -d 201201
$ phinx rollback -e development -d 20120103
$ phinx rollback -e development -d 2012010312
$ phinx rollback -e development -d 201201031205
$ phinx rollback -e development -d 20120103120530
如果设置了断点,阻止进一步回滚,您可以使用 --force
参数或缩写 -f
覆盖断点。
$ phinx rollback -e development -t 0 -f
使用 --dry-run
将查询打印到标准输出而不执行它们
$ phinx rollback --dry-run
注意
回滚时,Phinx 使用您在 phinx 配置文件的 version_order
选项中指定的顺序对执行的迁移进行排序。有关更多信息,请参见配置一章。
状态命令打印所有迁移的列表,以及它们当前的状态。您可以使用此命令来确定哪些迁移已运行。
$ phinx status -e development
如果数据库是最新的(即所有迁移都已完成),则此命令以代码 0 退出,否则退出以下代码之一
2: 至少有一个缺少的迁移。
3: 至少有一个向下迁移。
退出代码 1 表示发生了应用程序错误。
种子创建命令可用于创建新的数据库种子类。它需要一个参数,即类的名称。类名应使用驼峰命名法指定。
$ phinx seed:create MyNewSeeder
在您的文本编辑器中打开新的种子文件以添加您的数据库种子命令。Phinx 使用您在配置文件中指定的路径创建种子文件。有关更多信息,请参见配置一章。
您可以通过提供替代模板文件名来覆盖 Phinx 使用的模板文件。
$ phinx seed:create MyNewSeeder --template="<file>"
种子运行命令运行所有可用的种子类,或者选择只运行一个种子类。
$ phinx seed:run -e development
要仅运行一个种子类,请使用 --seed
参数或缩写 -s
。
$ phinx seed:run -e development -s MyNewSeeder
从命令行运行 Phinx 时,您可以使用 --configuration
或 -c
参数指定配置文件。除了 YAML 以外,配置文件还可以是作为 PHP 数组的 PHP 文件的计算输出
<?php
return [
"paths" => [
"migrations" => "application/migrations"
],
"environments" => [
"default_migration_table" => "phinxlog",
"default_environment" => "dev",
"dev" => [
"adapter" => "mysql",
"host" => $_ENV['DB_HOST'],
"name" => $_ENV['DB_NAME'],
"user" => $_ENV['DB_USER'],
"pass" => $_ENV['DB_PASS'],
"port" => $_ENV['DB_PORT']
]
]
];
Phinx 自动检测对具有 *.yaml
、*.yml
、*.json
和 *.php
扩展名的文件的语言解析器。也可以通过 --parser
和 -p
参数指定相应的解析器。除 "json"
或 "php"
之外的任何内容都将被视为 YAML。
使用 PHP 数组时,您可以提供一个具有现有 PDO 实例的 connection
键。传递数据库名称也很重要,因为 Phinx 在某些方法(如 hasTable()
)中需要它。
<?php
return [
"paths" => [
"migrations" => "application/migrations"
),
"environments" => [
"default_migration_table" => "phinxlog",
"default_environment" => "dev",
"dev" => [
"name" => "dev_db",
"connection" => $pdo_instance
]
]
];
Phinx 还可以通过使用 Phinx\Wrapper\TextWrapper
类在 Web 应用程序内部运行。这在 app/web.php
中提供了示例,该文件可以作为独立服务器运行
$ php -S localhost:8000 vendor/robmorgan/phinx/app/web.php
这将在 https://127.0.0.1:8000 处创建一个本地 Web 服务器,该服务器默认情况下将显示当前迁移状态。要向上运行迁移,请使用 https://127.0.0.1:8000/migrate,要回滚,请使用 https://127.0.0.1:8000/rollback。
包含的 Web 应用程序只是一个示例,不应在生产环境中使用!
注意
要在运行时修改配置变量并覆盖 %%PHINX_DBNAME%%
或其他动态选项,请在运行命令之前设置 $_SERVER['PHINX_DBNAME']
。可用的选项在“配置”页面中记录。
Phinx 可以被封装并作为单独的 Symfony 控制台应用程序运行。这可能有利于为用户提供一个统一的界面,用于应用程序的所有方面,或者因为您希望运行多个 Phinx 命令。虽然您可以通过 exec
运行命令或使用上面的 Phinx\Wrapper\TextWrapper
,但这使得很难以与您的应用程序类似的方式处理返回值和输出。
幸运的是,Symfony 使执行这种“元”命令变得直接。
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Phinx\Console\PhinxApplication;
// ...
protected function execute(InputInterface $input, OutputInterface $output)
{
$phinx = new PhinxApplication();
$command = $phinx->find('migrate');
$arguments = [
'command' => 'migrate',
'--environment' => 'production',
'--configuration' => '/path/to/phinx/config/file'
];
$input = new ArrayInput($arguments);
$returnCode = $command->run(new ArrayInput($arguments), $output);
// ...
}
这里,您正在实例化 PhinxApplication
,告诉它找到 migrate
命令,定义要传递给它的参数(与命令行参数和标志匹配),最后运行该命令,将相同的 OutputInterface
传递给它,您的应用程序使用。
有关更多信息,请参阅 Symfony 页面。
Phinx 可用于您的单元测试中以准备或填充数据库。您可以以编程方式使用它
public function setUp ()
{
$app = new PhinxApplication();
$app->setAutoExit(false);
$app->run(new StringInput('migrate'), new NullOutput());
}
如果您使用的是内存数据库,您需要为 Phinx 提供一个特定的 PDO 实例。您可以使用 Manager 类直接与 Phinx 交互
use PDO;
use Phinx\Config\Config;
use Phinx\Migration\Manager;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\NullOutput;
class DatabaseTestCase extends TestCase {
public function setUp ()
{
$pdo = new PDO('sqlite::memory:', null, null, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$configArray = require('phinx.php');
$configArray['environments']['test'] = [
'adapter' => 'sqlite',
'connection' => $pdo
];
$config = new Config($configArray);
$manager = new Manager($config, new StringInput(' '), new NullOutput());
$manager->migrate('test');
$manager->seed('test');
// You can change default fetch mode after the seeding
$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
$this->pdo = $pdo;
}
}