簡體   English   中英

跨數據庫表加入Drupal?

[英]Cross Database Table Joins in Drupal?

是否可以在drupal中進行跨數據庫聯接?

假設您有兩個數據庫drupalold_data_source 您想將drupal.node加入到old_data_source.page

可以調用db_set_active()以使用多個數據庫。 但是找不到關於跨數據庫表聯接的任何信息!

(我正在將其作為遷移腳本的一部分進行研究,並將刪除old_data_source

有一個鮮為人知的技巧可以完成此任務,它依賴於稱為表前綴的功能。 您可以將settings.php配置為使用其他數據庫的名稱為查詢中的某些表添加前綴,以便進行跨數據庫聯接。

看一下default.settings.php的注釋中的示例(Drupal 6中采用類似的語法),以了解如何進行設置。 在原始問題的情況下,默認$ databases條目上將具有一個前綴數組,如下所示:

'prefix' => array('page' => 'old_data_source.'),

然后使用類似以下內容的查詢:

db_query("SELECT * FROM {node} n LEFT JOIN {page} p on n.nid=p.nid");

Drupal DB抽象層將解釋{page}並將其轉換為SQL,如:

SELECT * FROM node n LEFT JOIN old_data_source.page p on n.nid=p.nid;

唯一要確保的是與默認Drupal數據庫關聯的數據庫用戶具有訪問這兩個數據庫的特權,否則此技巧將不起作用。

我想補充一下這個答案,因為我本人最近遇到了這個問題。 到目前為止,最簡單的解決方案(以我為例)是創建一個在后台進行聯接的mysql 視圖 這就消除了在drupal本身內部進行跨數據庫聯接的需要。

Drupal不支持一次擁有多個活動數據庫。 主要原因可能是這是mysql特有的功能。

您可以使用php進行此操作,並跳過Drupal數據庫層。 由於它僅適用於應該運行一次的遷移腳本,因此最好將代碼數據庫特定化。 只需我們mysql_ connect等。可能是結束使用db_set_active的好主意

除了在我之前提到的settings.php技巧中使用前綴之外,您還可以在傳遞給db_query()的查詢字符串中對前綴進行硬編碼(類似於您在問題中所做的操作)。

所以在這種情況下

drupal.node inner join old_data_source.page on blablabla

在d7上測試。

當然,您在db_set_active參數中使用的用戶必須有權訪問兩個數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM