在 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 的基本原則。

正如您已經看到的,遷移過程需要注意細節,因此請確保您首先在臨時服務器上工作,因為一個小錯誤可能會破壞整個站點。 我希望你喜歡這個教程。

謝謝閱讀!