[英]Cross Database Table Joins in Drupal?
是否可以在drupal中進行跨數據庫聯接?
假設您有兩個數據庫drupal
和old_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.