Phinx迁移sqlite内存phpunit
使用sqlite内存的Phinx迁移在0.9.2中似乎不起作用,我有一个非常简单的应用程序,只有一个表(产品)。运行迁移后,产品表不存在:Phinx迁移sqlite内存phpunit,php,mysql,phpunit,database-migration,phinx,Php,Mysql,Phpunit,Database Migration,Phinx,使用sqlite内存的Phinx迁移在0.9.2中似乎不起作用,我有一个非常简单的应用程序,只有一个表(产品)。运行迁移后,产品表不存在: use Symfony\Component\Yaml\Yaml; use Phinx\Config\Config; use Phinx\Migration\Manager; use Symfony\Component\Console\Input\StringInput; use Symfony\Component\Console\Output\NullOut
use Symfony\Component\Yaml\Yaml;
use Phinx\Config\Config;
use Phinx\Migration\Manager;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\NullOutput;
$pdo = new PDO('sqlite::memory:', null, null, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$settings = Yaml::parseFile('../phinx.yml');
$settings['environments']['testing'] = [
'adapter' => 'sqlite',
'connection' => $pdo
];
$config = new Config($settings);
$manager = new Manager($config, new StringInput(' '), new NullOutput());
$manager->migrate('testing');
$manager->seed('testing');
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
// This line creates an exception of table doesn't exist
$pdo->query("SELECT * FROM product");
最后一行查询生成以下异常的product表:
PDOException:SQLSTATE[HY000]:一般错误:1第43行的/home/vagrant/code/ecommerce/public/index.php中没有这样的表:product
为了完整起见,以下是产品迁移,它与mysql开发环境完美配合:
use Phinx\Migration\AbstractMigration;
class Product extends AbstractMigration
{
public function change()
{
$table = $this->table('product');
$table->addColumn('name', 'string', ['limit' => 100, 'null' => false])
->addColumn('price', 'integer')
->create();
}
}
通常从命令行使用phinx时,phinx\Config的configFilePath属性被正确设置为phinx.yml的完整路径 然而,在phinx文档()中创建用于phpunit测试的sqlite内存数据库的示例中,它使用php数组,因为必须手动输入pdo实例 由于未设置phinx.yml的路径,因此phinx\Config的replaceTokens方法通过调用以下命令创建phinx\u Config\u目录:
$tokens['%%PHINX_CONFIG_DIR%%'] = dirname($this->getConfigFilePath());
Phinx使用%%Phinx_CONFIG_DIR%%确定其迁移和种子文件夹的位置,如果不使用Phinx.yml,则此功能将不再有效
解决方案是在手动创建配置类时提供路径:
$config = new Config($settings, './');
我仔细研究了代码,发现配置构造函数有一个$configFilePath参数。如果不传递这些信息,迁移和种子的路径就无法正确构建。一旦输入路径,我就能够通过编程方式创建sqlite内存数据库。