Cách xác định và sử dụng kết nối cơ sở dữ liệu bên ngoài trong mô-đun tùy chỉnh


10

Tôi đang phát triển một mô-đun sẽ phụ thuộc nhiều vào các truy vấn cơ sở dữ liệu bên ngoài. Có cách thực hành tốt nhất để xác định và sử dụng kết nối cơ sở dữ liệu bên ngoài trong suốt mô-đun không?

Trang này cho tôi biết cách tạo kết nối, nhưng không đặt nó ở đâu trong một mô-đun (hook cụ thể?) Vì vậy tôi chỉ phải xác định nó một lần. Ngoài ra, luôn luôn cần phải thực hiện "db_set_active ('YourDatabaseKey');" hoặc tôi có thể vượt qua một đối số sẽ đặt db để sử dụng không? Tôi đang sử dụng Drupal 7.


Nếu bạn đang sử dụng các loại cơ sở dữ liệu khác nhau, bạn sẽ cần mô-đun DBTNG
Sivaji

Cảm ơn lời đề nghị, nhưng mô-đun đó chỉ cần thiết nếu bạn đang sử dụng Drupal 6. Tôi đang sử dụng Drupal 7.
Whiskey

Câu trả lời:


10

Không có nơi nào đặc biệt để đặt mã này (hook hoặc module), bạn chỉ cần đặt nó ở nơi bạn cần.
Vì vậy, nó nên đi ngay trước các truy vấn của bạn trên cơ sở dữ liệu khác và ngay sau đó để đặt lại DB mặc định.

Nếu tất cả các mô-đun của bạn sẽ dựa vào DB bên ngoài, chỉ cần đặt nó vào đầu của hàm đầu tiên được gọi cho mô-đun của bạn và ở cuối hàm cuối cùng.

Tất nhiên, mọi chức năng của bạn sẽ được thực thi trên DB bên ngoài và không có gì phải truy vấn cơ sở dữ liệu mặc định mà không cần chuyển lại.

Mã sau đây sẽ thất bại:

db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

$node = node_load(123); //This would fail on the external DB.

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 

Bạn nên chuyển đổi qua lại:

db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 
$node = node_load(123); //Query made on the default Drupal DB.
db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 

2
Cảm ơn đã giải thích. Tôi đã kết thúc việc tạo một hàm riêng biệt chọn db ngoài của tôi với db_set_active và nếu thất bại, nó sẽ thêm cấu hình db và thử lại. Bằng cách đó tôi có thể sử dụng nó trong các hook khác nhau trước khi chạy các truy vấn bên ngoài, nhưng tôi cần phải thiết lập lại hoạt động mặc định như bạn đã chỉ ra.
Whiskey

4

Bạn sẽ phải thêm vào settings.phpnằm ở /sites/default/cú pháp sau

// Drupal 6

$db_url['default'] = 'mysql://db_user:password@localhost/db_name';
$db_url['external'] = 'mysql://db_user2:password@localhost/db_name2';

// Drupal 7

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'db1',
      'username' => 'user1',
      'password' => 'pass',
      'host' => 'host1',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
  'extra' =>
  array (
    'default' =>
    array (
      'database' => 'db2',
      'username' => 'user2',
      'password' => 'pass',
      'host' => 'host2',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

Và sau các cài đặt này, bạn có thể sử dụng db_set_active () để chuyển giữa các cơ sở dữ liệu.


Cảm ơn, bạn có thể làm theo cách này, nhưng tôi đã chọn thực hiện từ bên trong mô-đun của mình như được mô tả trên trang tôi liên kết đến trong câu hỏi. Bằng cách đó, bạn có thể yêu cầu người dùng quản trị điền vào cấu hình của riêng họ trên biểu mẫu cài đặt quản trị viên.
Whiskey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.