使用迁移模块进行迁移


8

我正在使用Drupal 7和最新的Migrate模块。我正在尝试创建一个类,将产品从OpenCart DB迁移到新的D7站点。我弄清楚了我需要的所有SQL,并对其进行了大部分编程。但是,在理解如何进行这些类别方面遇到了一些麻烦。

我的迁移目标是Ubercart。

我想了解的内容是migrate_example模块,它是Migrate的子模块。具体来说,我正在研究WineWineMigration类中的wine.inc文件。我正在尝试理解迁移一词。

我有两个清单将成为Ubercart产品中的分类术语。首先是类别。我已经手动设置了类别,因此当我使用(使用GROUP_CONCAT SQL函数)将它们的列表带到上方时,我将拥有一堆ID,这些ID将使用包含所有ID转换的数组进行映射。很好,但是当我查看他们正在迁移的BestWith信息时,表明它正在使用上面的WineBestWith类导入术语。

我对此感到困惑,因为它看起来像是术语的某种二次迁移。那是怎么回事吗?此外,在这个术语迁移类中,这是我放置映射数组的地方吗?

我接下来要做的是处理标签。在OpenCart中,我们有一堆自由格式标签。当我在Ubercart中手动创建产品时,我会看到一个用于标签的自动填充字段。在该字段中,我只需输入逗号分隔的术语列表即可创建多个术语。我可以在“迁移”模块中做同样的事情吗?我可以将字段映射到用逗号分隔的术语列表吗?会为每个产品在其中添加标签吗?

Answers:


14

我正在处理同一个问题,因此我了解您的困惑。您有很多问题,但是我认为可以将它们总结为一个单一的问题:

迁移模块如何处理将规范化数据库迁移到Drupal安装中?

绝对不是那么简单,但这是我对它如何工作的理解。我们将从顶部(WineWineMigration)开始,然后边走边问问题。

我们从查看课程顶部的代码开始WineWineMigration

...
$this->dependencies = array('WineVariety', 'WineRegion',
  'WineBestWith', 'WineUser', 'WineProducer');
...

这告诉Migrate模块,要迁移您的Wine内容,必须先完成相关的迁移-WineVariety,WineRegion,WineBestWith,WineUser,WineProduce。

因此,我们在这里了解到的是迁移可以依赖于其他迁移

接下来,我们在当前保存基本葡萄酒信息的表与Drupal节点之间进行映射:

$this->map = new MigrateSQLMap($this->machineName,
  array(
    'wineid' => array(
      'type' => 'int',
      'unsigned' => TRUE,
      'not null' => TRUE,
      'description' => 'Wine ID',
      'alias' => 'w',
    )
  ),
  MigrateDestinationNode::getKeySchema()
);

这非常简单,因此如果您需要澄清,我会提供。

我将跳过一些与各种类别和酒品对象无关的临时性内容。

现在我们来了解字段映射。观察:

// Mapped fields
$this->addFieldMapping('title', 'name')
     ->description(t('Mapping wine name in source to node title'));
$this->addFieldMapping('uid', 'accountid')
     ->sourceMigration('WineUser')
     ->defaultValue(1);
// TIP: By default, term relationship are assumed to be passed by name.
// In this case, the source values are IDs, so we specify the relevant
// migration (so the tid can be looked up in the map), and tell the term
// field handler that it is receiving tids instead of names
$this->addFieldMapping('migrate_example_wine_varieties', 'variety')
     ->sourceMigration('WineVariety')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_best_with', 'best_with')
     ->separator(',')
     ->sourceMigration('WineBestWith')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('field_migrate_example_wine_ratin', 'rating');
$this->addFieldMapping('field_migrate_example_top_vintag', 'best_vintages');

看到它说:

->sourceMigration(...)

这向迁移表明,为了映射此字段,必须首先满足另一个迁移。我相信这就是您所说的“二次迁移”。让我们以region字段映射为例。分解...

$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));

这表示源数据库中的类别区域已映射到区域词汇表术语。正如TIP注释在字段映射代码块中指出的那样,它假定映射是基于field_names进行的,但是由于我们依赖于您所说的二次迁移,因此我们需要指定它所依赖的迁移并指示它使用提示而不是字段名称。

因此,对于源数据库中存在的每个规范化表,几乎都要为每个表指定迁移,然后在涉及这些表的相关字段映射中,将在字段映射调用中指定相关迁移,以及每次迁移开始时的从属迁移声明。

我希望这有帮助。我本人对此并不完全了解,因此我以此为契机,加深了对Migrate如何关联数据库的理解。随着我学到更多,我将相应地更新答案。


1
让我知道您是否需要澄清。我意识到这个帖子有点
Lester Peabody
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.