在 Drupal 8/9 中从 CSV 文件迁移数据

已发表: 2022-02-16

将数据从 CSV 文件迁移到 Drupal 数据库的过程可以通过 Drupal 的集成 Migrate API 和三个额外的自定义模块(Migrate Source CSV、Migrate Plus 和 Migrate Tools)来完成。

这被称为 ETL(提取 - 转换 - 加载)过程,其中数据在第一步从一个源中获取,在第二步中进行转换,最后在第三步中加载到 Drupal 数据库上的目的地。

本教程将解释为图书馆数据库创建 12 个图书节点。 继续阅读以了解如何操作!

在 Drupal 8/9 中从 CSV 文件迁移数据

步骤 # 1 - 安装 Drush 和所需的模块

要在 Drupal 中执行迁移,我们需要 Drush。 Drush 不是 Drupal 模块,而是执行 Drupal 命令的命令行界面。 要安装最新版本的 Drush,

  • 打开系统的终端应用程序
  • 光标放在/web目录之外。
  • 类型:作曲家需要 drush/drush

这会将 Drush 安装在 Drupal 安装的vendor/bin/drush目录中。 但是,每次要执行 drush 命令时,键入vendor/bin/drush而不是drush很麻烦。

Drush 启动器可以在每个项目的基础上执行每个 Drupal 安装的特定 Drush 版本。

为什么这有意义?

每个项目都有不同的需求,特定的 Drush 版本有助于避免依赖问题。 某些 contrib 模块可能无法与最新版本的 Drush 一起正常工作。

OSX 和 Windows 系统的具体说明可以在这里找到:https://github.com/drush-ops/drush-launcher#installation---phar

对于 Linux 系统:

  • 键入以下内容以从 GitHub 下载名为drush.phar的文件:

wget -O drush.phar
https://github.com/drush-ops/drush-launcher/releases/latest/download/drush.phar

  • 键入以下内容以使文件可执行: chmod +x drush.phar
  • 键入以下命令将.phar文件移动到$PATH并作为全局命令运行 Drush: sudo mv drush.phar /usr/local/bin/ drush

现在是时候安装所需的贡献模块来执行迁移了。

  • 键入以下内容:

composer require drupal/migrate_tools
composer require drupal/migrate_source_csv


在 Drupal 8/9 中从 CSV 文件迁移数据 Composer 完成模块下载后,

  • 在浏览器中打开Drupal 后端
  • 单击扩展
  • 启用MigrateMigrate PlusMigrate ToolsMigrate Source CSV
  • 点击安装

在 Drupal 8/9 中从 CSV 文件迁移数据


第 2 步 - 关于 ETL 流程的更多信息

提取、转换和加载数据的过程可以通过在 .yml 文件中定义迁移,然后使用 Drush 命令执行,从而可以正确填充 Drupal 数据库。

有一些重要的事实需要注意:

  1. 每一步都是通过 Drupal 插件执行的。
  2. 您只能在流程的第一步(源定义,即提取)和最后一步(目标定义,即加载)中使用一个插件。
    • 换句话说,您只能从一个源(CSV 文件、JSON 提要等)获取数据并将其存储在 Drupal 中的特定实体包下,例如文章、页面、自定义内容类型、用户或配置实体也是如此。
  3. 您可以根据需要使用尽可能多的插件来对数据进行建模,以使其与 Drupal 期望的格式相匹配。
  4. Drupal 默认有一个可以在定义文件中使用的源/进程/目标插件列表。

要查看所有源插件的列表,

  • 打开终端窗口。
  • 键入以下内容:

drush ev
"print_r(array_keys(\Drupal::service('plugin.manager.migrate.source')->getDefinitions()));"

该列表有点长,请记住,您可以在流程步骤中使用尽可能多的插件。

要查看所有目标插件的列表,

  • 类型

drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.destination')->getDefinitions()));"


"

注意: csv 插件在那里是因为我们已经启用了 Migrate Source CSV 模块。

要查看所有进程插件的列表,

  • 键入以下内容:

drush ev
"print_r(array_keys(\Drupal::service('plugin.manager.migrate.source')->getDefinitions()));"

该列表有点长,请记住,您可以在流程步骤中使用尽可能多的插件。

注意:存在 csv 插件是因为我们已经启用了 Migrate Source CSV 模块。要查看所有进程插件的列表,请键入: drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.source')->getDefinitions()));"该列表有点长,请记住,您可以在流程步骤中使用尽可能多的插件。要查看所有目标插件的列表,请键入: drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.destination')->getDefinitions()));"

要查看所有目标插件的列表,

  • 键入以下内容:

drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.destination')->getDefinitions()));"


注意:存在 csv 插件是因为我们已经启用了 Migrate Source CSV 模块。要查看所有进程插件的列表,请键入: drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.source')->getDefinitions()));"该列表有点长,请记住,您可以在流程步骤中使用尽可能多的插件。要查看所有目标插件的列表,请键入: drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.destination')->getDefinitions()));"

步骤#3 - 创建内容类型

  • 单击结构 > 内容类型 > 添加内容类型
  • 创建“图书”内容类型
  • 单击保存和管理字段
  • 使用CSV 文件的标题行创建字段

我将连接列 edition_number 和 editor 的值,因此为此我只需要数据库中的一个字段。

注意:字段名称(机器名称)不必与 CSV 文件的列名称完全匹配,但至少将它们与相似的词相关联是有意义的——这简化了流程步骤中的字段映射。

在 Drupal 8/9 中从 CSV 文件迁移数据

每个 Drupal 节点都必须有标题字段,因此不需要创建标题字段。 您可以保持正文字段不变,也可以将其删除,这取决于您计划对特定内容类型执行的操作。


步骤 # 4 - 迁移定义文件

源步骤

  • 打开您喜欢的代码编辑器
  • 键入以下内容:

id: my_first_migration
label: Migrate terms from a CSV source
source:
plugin: csv
path: public://csv/library.csv
header_row_count: 1
ids:
[id]
delimiter: ';'
enclosure: "'"

文件的 id 与其名称匹配。

我们在源代码部分使用 contrib 模块 Migrate Source CSV 的csv插件。

header_row_count选项中的数字 1 表示列标题的值(它们都放在第一行)。

ids定义为 CSV 文件中的每条记录提供唯一标识符,在本例中为整数类型的id列。 不要忘记括号,因为模块在这里需要一个数组。

分隔符附件是指CSV文件的结构,在我的特殊情况下,它是用“;”分隔的字符,而字符串用“'”单引号括起来。

在 Drupal 8/9 中从 CSV 文件迁移数据

另请注意,路径的定义。 那是你必须放置 CSV 文件的地方,这样 Drupal 就可以从中读取数据。

  • 打开您的终端应用程序。
  • 类型

mkdir web/sites/default/files/csv
cp /home/path/to/library.csv web/sites/default/files/csv/
chmod -R 777 web/sites/default/files/csv/

这会:

  1. 在 Drupal 安装的公共文件夹中创建一个名为 csv 的目录。
  2. 将 CSV 文件的副本放在该目录中。
  3. 使系统中的每个人都可以访问该文件(包括源插件)。

工艺步骤

这是我们将 CSV 文件的每一列与内容类型中的字段映射的地方:

process:
title: title
field_id: id
field_author: author
field_location: location
field_availability: availability
field_editor:
plugin: concat
source:
- editor
- edition_number
delimiter: ' '
type:
plugin: default_value
default_value: book

field_editor字段将是执行 2 个字符串(编辑器edition_number列中的值)连接的结果。
drupal_machine_name: csv_column_name形式的前 5 个键/值对将 CSV 记录映射到数据库字段,而不执行任何更改。

delimiter选项可以在两个字符串之间设置分隔符,在本例中为空格。

default_value插件帮助我们定义实体类型,因为此信息在源数据中不可用。

目标步骤

此过程的最后一部分是目标步骤。

destination:
plugin: entity:node

我们正在迁移内容,每条记录都是一个节点。


步骤 # 5 - 执行迁移

  • 单击配置 > 配置同步 > 导入 > 单项
  • 从下拉列表中选择迁移
  • .yml文件中的代码粘贴到 textarea 中
  • 点击导入

在 Drupal 8/9 中从 CSV 文件迁移数据

  • 单击确认以同步配置。 您将收到消息“配置已成功导入”
  • 更改为终端应用程序。
  • 键入以下内容:

drush migrate:import my_first_migration


在 Drupal 8/9 中从 CSV 文件迁移数据

您现在可以检查您网站上的内容。

在 Drupal 8/9 中从 CSV 文件迁移数据

您已经了解了将数据从 CSV 文件迁移到 Drupal 8/9 的基本原则。

正如您已经看到的,迁移过程需要注意细节,因此请确保您首先在暂存服务器上工作,因为一个小错误可能会破坏整个站点。 我希望你喜欢这个教程。

谢谢阅读!