在 Drupal 8/9 中從 CSV 文件遷移數據 - OSTraining

已發表: 2022-06-29

將數據從 CSV 文件遷移到 Drupal 數據庫的過程可以通過 Drupal 的集成 Migrate API 和三個額外的自定義模塊(Migrate Source CSV、Migrate Plus 和 Migrate Tools)來完成。

這被稱為 ETL(提取 - 轉換 - 加載)過程,其中數據在第一步從一個源獲取,在第二步進行轉換,最後在第三步加載到 Drupal 數據庫上的目的地。

本教程將解釋為圖書館數據庫創建 12 個圖書節點。 繼續閱讀以了解如何操作!

步驟 # 1 – 安裝 Drush 和所需的模塊

要在 Drupal 中執行遷移,我們需要 Drush。 Drush 不是 Drupal 模塊,而是執行 Drupal 命令的命令行界面。 要安裝最新版本的 Drush,

  • 打開系統的終端應用程序
  • 光標放在/web目錄之外。
  • 類型: composer require 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

這將從 GitHub 下載名為drush.phar的文件。

  • 鍵入以下內容以使文件可執行: chmod +x drush.phar
  • 類型sudo mv drush.phar /usr/local/bin/ drush

這會將.phar文件移動到您的$PATH並作為全局命令運行 Drush。

現在是時候安裝所需的貢獻模塊來執行遷移了。

  • 鍵入以下內容:
 composer require drupal/migrate_tools composer require drupal/migrate_source_csv

Composer 完成模塊下載後,

  • 在瀏覽器中打開Drupal 後端
  • 單擊擴展
  • 啟用MigrateMigrate PlusMigrate ToolsMigrate Source 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()));"

注意: 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 節點都必須有title字段,因此不需要創建標題字段。 您可以保持正文字段不變,也可以將其刪除,這取決於您計劃對特定內容類型執行的操作。


步驟 # 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 文件中的每條記錄提供唯一標識符,在本例中為integer類型的id列。 不要忘記括號,因為模塊在這裡需要一個數組。

delimiterenclosure是指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

drupal_machine_name: csv_column_name形式的前 5 個鍵/值對將 CSV 記錄映射到數據庫字段,而不執行任何更改。

field_editor字段將是執行 2 個字符串(編輯器edition_number列中的值)連接的結果。

delimiter選項可以在兩個字符串之間設置分隔符,在本例中為空格。

default_value插件幫助我們定義實體類型,因為此信息在源數據中不可用。

目標步驟

此過程的最後一部分是目標步驟。

 destination: plugin: entity:node

我們正在遷移內容,每條記錄都是一個節點。


步驟 # 5 – 執行遷移

  • 單擊配置 > 配置同步 > 導入 > 單項
  • 從下拉列表中選擇遷移
  • .yml文件中的代碼粘貼到 textarea 中
  • 點擊導入
  • 單擊確認以同步配置。 您將收到消息“配置已成功導入”
  • 更改為終端應用程序。
  • 鍵入以下內容:
 drush migrate:import my_first_migration

您現在可以檢查您網站上的內容。

您已經了解了將數據從 CSV 文件遷移到 Drupal 8/9 的基本原則。

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

謝謝閱讀!