Migration 如何调试Drupal 8迁移中被忽略的项
我使用migrate_升级模块创建了迁移脚本,但在迁移过程中有很多被忽略的项目,我尝试使用migrate tools中的drush mmsg,但对忽略的字段没有帮助,只是失败了 我不确定是否有“更合适”的方法来调查各个迁移作业的情况,但我只是查看我的migrate_*数据库表。它没有告诉我特定行失败的原因,但至少我能够准确地确定需要调查哪些行Migration 如何调试Drupal 8迁移中被忽略的项,migration,drupal-8,Migration,Drupal 8,我使用migrate_升级模块创建了迁移脚本,但在迁移过程中有很多被忽略的项目,我尝试使用migrate tools中的drush mmsg,但对忽略的字段没有帮助,只是失败了 我不确定是否有“更合适”的方法来调查各个迁移作业的情况,但我只是查看我的migrate_*数据库表。它没有告诉我特定行失败的原因,但至少我能够准确地确定需要调查哪些行 在与您感兴趣的迁移作业相匹配的migrate_*表中,查找destid1值为NULL的行。如上所述,一旦标识了行,有时仍然很难找到。在我的案例中,它触发了
在与您感兴趣的迁移作业相匹配的migrate_*表中,查找destid1值为NULL的行。如上所述,一旦标识了行,有时仍然很难找到。在我的案例中,它触发了对以前导入的实体的更新,然后该实体抛出了一个行跳过异常 您可以通过观察
MigrateExecutable::import()
中的while($source->valid())
循环,找出引发异常的原因。现在在198号线附近。在那里,它有一个try-catch,它将捕获异常,告诉它跳过该行
如果有调试器,请为跳过的ID设置一个监视,然后从异常中获取触发该ID的行和文件
如果您不这样做,就值得一次,但是您可以基于
sourceIdValues
添加If
,并打印$e->getLine()
$e->getFile()
获取引发异常的位置。我的首选是使用xdebug和PHP异常断点来探索引发各种迁移异常时发生的情况。我使用PHPStorm,所以我使用Run>View Breakpoints菜单项来打开Breakpoints窗口。然后添加以下PHP断点:
然后执行迁移(在此之前,您必须确保PHPStorm正在侦听并正确使用xdebug处理断点等)。当抛出其中一个异常时,PHPStorm停止调用。我使用Frames窗口浏览调用堆栈,查看随时间变化的变量。这使得在每一步中都可以很容易地识别字段和数据(源、目标、行等)。您正在从Drupal 7迁移到Drupal 8,并且在运行迁移后忽略了项。这就引出了一个非常重要的问题:哪些被忽略了 你看到了什么 以上是我将在示例中使用的内容 你想知道什么 哪些项目被忽略!?为此,我们可以查看数据库。我想你可以访问控制台 数据库中的
migrate\u map\u migration\u name
表将为您提供所需的信息。将有一个名为源\行\状态的列
。值2等于已忽略的状态。因此,运行以下MySQL命令:
从“迁移映射节点表单”中选择*,其中源行状态=2;
返回行的sourceid1
列将包含被忽略项的id
示例输出:
+-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
| source_ids_hash | sourceid1 | destid1 | source_row_status | source_row_status | last_imported | hash |
+-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
| 8530eb5d63ad4cfea47134a28e3339e089f639164d218287c3... | 10931 | NULL | 2 | 0 | 0 | |
+-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
| ddd550e747c2a26a2a5058d49be0e146616fd5c45f6bef88f3... | 11656 | NULL | 2 | 0 | 0 | |
+-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
在我的例子中,它是一个静态映射插件,这是错误的。您所说的while循环现在位于MigrateExecutable.php的第198行。对$e->getLine和$e->getFile使用一些\Drupal::logger调用可以帮助我找出发生了什么。非常感谢!
+-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
| source_ids_hash | sourceid1 | destid1 | source_row_status | source_row_status | last_imported | hash |
+-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
| 8530eb5d63ad4cfea47134a28e3339e089f639164d218287c3... | 10931 | NULL | 2 | 0 | 0 | |
+-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
| ddd550e747c2a26a2a5058d49be0e146616fd5c45f6bef88f3... | 11656 | NULL | 2 | 0 | 0 | |
+-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+