在 Drupal 8/9 中從 CSV 文件遷移數據
已發表: 2022-02-16將數據從 CSV 文件遷移到 Drupal 數據庫的過程可以通過 Drupal 的集成 Migrate API 和三個額外的自定義模塊(Migrate Source CSV、Migrate Plus 和 Migrate Tools)來完成。
這被稱為 ETL(提取 - 轉換 - 加載)過程,其中數據在第一步從一個源中獲取,在第二步中進行轉換,最後在第三步中加載到 Drupal 數據庫上的目的地。
本教程將解釋為圖書館數據庫創建 12 個圖書節點。 繼續閱讀以了解如何操作!
步驟 # 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
Composer 完成模塊下載後,
- 在瀏覽器中打開Drupal 後端
- 單擊擴展
- 啟用Migrate 、 Migrate Plus 、 Migrate Tools和Migrate Source CSV
- 點擊安裝
第 2 步 - 關於 ETL 流程的更多信息
提取、轉換和加載數據的過程可以通過在 .yml 文件中定義遷移,然後使用 Drush 命令執行,從而可以正確填充 Drupal 數據庫。
有一些重要的事實需要注意:
- 每一步都是通過 Drupal 插件執行的。
- 您只能在流程的第一步(源定義,即提取)和最後一步(目標定義,即加載)中使用一個插件。
- 換句話說,您只能從一個源(CSV 文件、JSON 提要等)獲取數據並將其存儲在 Drupal 中的特定實體包下,例如文章、頁面、自定義內容類型、用戶或配置實體也是如此。
- 您可以根據需要使用盡可能多的插件來對數據進行建模,以使其與 Drupal 期望的格式相匹配。
- 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()));"
該列表有點長,請記住,您可以在流程步驟中使用盡可能多的插件。
要查看所有目標插件的列表,
- 鍵入以下內容:
drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.destination')->getDefinitions()));"

步驟#3 - 創建內容類型
- 單擊結構 > 內容類型 > 添加內容類型
- 創建“圖書”內容類型
- 單擊保存和管理字段
- 使用CSV 文件的標題行創建字段
我將連接列 edition_number 和 editor 的值,因此為此我只需要數據庫中的一個字段。
注意:字段名稱(機器名稱)不必與 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文件的結構,在我的特殊情況下,它是用“;”分隔的字符,而字符串用“'”單引號括起來。
另請注意,路徑的定義。 那是你必須放置 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/
這會:
- 在 Drupal 安裝的公共文件夾中創建一個名為 csv 的目錄。
- 將 CSV 文件的副本放在該目錄中。
- 使系統中的每個人都可以訪問該文件(包括源插件)。
工藝步驟
這是我們將 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 中
- 點擊導入
- 單擊確認以同步配置。 您將收到消息“配置已成功導入”
- 更改為終端應用程序。
- 鍵入以下內容:
drush migrate:import my_first_migration
您現在可以檢查您網站上的內容。
您已經了解了將數據從 CSV 文件遷移到 Drupal 8/9 的基本原則。
正如您已經看到的,遷移過程需要注意細節,因此請確保您首先在臨時服務器上工作,因為一個小錯誤可能會破壞整個站點。 我希望你喜歡這個教程。
謝謝閱讀!