You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite驱动下Doctrine Migrations API无法执行迁移问题求助

解决Doctrine Migrations API在SQLite内存库中报错元数据存储未初始化的问题

问题分析

核心原因是:Doctrine Migrations的CLI命令会自动检测并初始化元数据存储表,但直接调用API时不会触发这个逻辑。尤其是SQLite内存库(:memory:),每次新建连接都会重置整个数据库,所以必须在执行迁移前手动初始化元数据存储;而MySQL因为数据库是持久化的,第一次CLI执行后元数据表已存在,因此API调用能正常工作。

解决方案

在执行迁移计划之前,通过API手动触发元数据存储的同步操作,修改代码如下:

$connectionLoader = new ConfigurationFile('./migrations-db.php');
$configurationLoader = new ConfigurationFileWithFallback('./migrations.php');
$dependencyFactory = DependencyFactory::fromConnection($configurationLoader, $connectionLoader);

// 新增:手动同步元数据存储
$metadataStorageManager = $dependencyFactory->getMetadataStorageManager();
$metadataStorageManager->syncMetadataStorage();

$version = $dependencyFactory->getVersionAliasResolver()->resolveVersionAlias('latest');
$planCalculator = $dependencyFactory->getMigrationPlanCalculator();
$plan = $planCalculator->getPlanUntilVersion($version);
$migrator = $dependencyFactory->getMigrator();
$migratorConfigurationFactory = $dependencyFactory->getConsoleInputMigratorConfigurationFactory();
$migratorConfiguration = $migratorConfigurationFactory->getMigratorConfiguration(new ArrayInput([]));
$sql = $migrator->migrate($plan, $migratorConfiguration);

关键说明

  • MetadataStorageManager的syncMetadataStorage()方法会自动创建Doctrine Migrations所需的元数据表(默认是doctrine_migration_versions),效果和CLI执行doctrine-migrations:sync-metadata-storage命令完全一致。
  • 针对SQLite内存库,必须确保整个迁移过程使用同一个数据库连接,否则内存库会被重置,之前创建的元数据表会丢失。当前代码通过DependencyFactory管理连接,只要不重新创建连接实例,就能满足这一要求。

内容的提问来源于stack exchange,提问作者WangZhihui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:16:09