Làm cách nào để kết nối nhiều CSDL khác nhau trong Drupal?

Events happening in the community are now at Drupal community events on www.drupal.org.
dom.killer's picture

Tôi tìm được bài viết này, rất mừng
http://drupal.org/node/18429
Nhưng tới đoạn: "This only works with two databases of the same type"

Có cách nào để sử dụng cùng lúc MySQL và Oracle không?

Comments

Hiện thời Drupal chỉ

thehong's picture

Hiện thời Drupal chỉ hỗ trợ MySQl và PostgreSQL. Muốn là việc với các hệ cơ sở dữ liệu khác, nên xây dựng các webservices. Nhân Drupal có tích hợp XMLRPC khá hay, ngoài ra cũng có các module khác cũng hữu ích: services, json_server, RDF, ... Project SIREN của hswong cũng đáng để tham khảo.

Thế Hồng

Tôi biết chỉ hỗ trợ

dom.killer's picture

Tôi biết chỉ hỗ trợ MySQl và PostgreSQL, ý của tôi là thay đổi cách load các driver cho thao tác với CSDL. Cách hiện nay của Drupal chỉ load được 1 driver vì tên hàm của các driver đều giống nhau (db_*). Còn cách nào khác mà không cần tạo Class không?

Có thể là cách này chăng:
<?php
$driver = 'mysql';
function db_query($query)
{
global $driver;
call_user_func('db_'.$driver.'_query', $query);
}

function db_mysql_query()
{
...
}

Nếu so về tốc độ thì call_user_func không nhanh bằng chạy trực tiếp, nhưng vẫn nhanh hơn nhiều so với method trong class, lại ít tốn memory. Tóm lại là dùng nhiều kiểu CSDL cùng một lúc chứ không phải hỗ trợ nhiều kiểu CSDL mà không dùng được cùng với nhau.

Vào file

thehong's picture

Vào file sites/xxx/settings.php, định nghĩa thêm một biến chứa thông tin kết nối CSDL:

<?php
# default db configuration
$db_url = 'mysql://root:root@localhost/databasename001';

# this is your additional datbase
$db_url_2 = 'postgre://foo:bar@localhost/databasename002';

# ...
?>

Mỗi khi muốn sử dụng hàm db_query/pager_query đối với db2 thì:

<?php
db_set_active
($db_url_2);
$query = db_query ('...');
db_set_active($db_url);
?>

Tham khảo thêm hàm db_query và db_set_active.

Thế Hồng

Bạn vẫn chưa hiểu

dom.killer's picture

Bạn vẫn chưa hiểu rồi. Làm theo cách bạn hướng dẫn thì 100% là báo lỗi do trùng tên hàm. Trong bài viết kia cũng đã ghi chú rồi, đâu thể làm như thế được. Chỉ có thể cùng là MySQL hoặc cùng là PostgreSQL chứ không thể dùng cả 2 một lúc dù có set active. Bạn xem thử: http://api.drupal.org/api/function/db_set_active/6

Đúng là tôi nói bậy

thehong's picture

Đúng là tôi nói bậy rồi, code ở trên cũng trật lất :-D Nếu như vậy thì đành phải chấp nhận, hệ thống chỉ cùng lúc hoạt động với một loại hệ cơ sở dữ liệu. Xin lỗi.

Thế Hồng

Mới tìm được patch

thehong's picture

Mới tìm được patch này: http://drupal.org/node/19522#comment-321714

Adrian cũng viết:

Regarding benchmarking, I'm almost certain that it will be slower.

My requirements were to make it all plug and play, without modifying all core calls to the db layer. Unfortunately I fear that there will be performance concerns related to this.

Basically I copied and pasted all the function definitions for the current db api, and wrote code that pointed the function calls at a new dispatcher I wrote (db_invoke). The entire process is eerliy similar to having to write phptemplate stubs to override functions, just to redirect them to the phptemplate template finder. (ie: endless 2 line functions).

If this makes it in core, I think it would be more sane to change core to call the dispatcher directly (ie: db_invoke('query', 'select * from blah')) ). Consider how often it's being called, we could even make a case for db('query', $string);. That is also nice because it's something a regular expression could make quick work of.

This dramatically reduces the amount of code that is required, and also removes an extra function call per db call (literally anything that is db_* now).

Thế Hồng

Kết nối CSDL Drupal với Phpbb3

emtapchat's picture

Ai biết cách dùng chung CDSL của 2 cái này không, khi mình đăng ký acc ở Drupal thì có thể đăng nhập vào diễn đàn Phpbb3 và ngược lại.

Thanks