Làm cách nào để chỉ định cơ sở dữ liệu nào nên tạo lược đồ của tôi?


12

Khi sử dụng nhiều cơ sở dữ liệu trong Drupal 7, làm cách nào tôi có thể chỉ định rằng một bảng sẽ được tạo trong cơ sở dữ liệu khác nhau trên một máy chủ khác?

Theo mặc định, khi bạn cài đặt một mô-đun, Drupal giả định rằng mọi thứ trong hook_schema()nên được cài đặt trong cơ sở dữ liệu mặc định. Có cách nào để xác định rằng một bảng nên được tạo trên một cơ sở dữ liệu khác nhau, hoặc có một cách giải quyết thủ công nào tôi có thể sử dụng không?


Suy nghĩ ban đầu của tôi là bạn không thể làm điều này ở cấp API. Lý do là mô-đun của bạn sẽ được gắn với một cấu hình cơ sở dữ liệu cụ thể và hiếm. Tôi giả sử đây là một mô-đun cụ thể trang web? Tôi tin rằng bản sửa lỗi của bạn cũng sẽ cần phải là cấu hình trang web / db cụ thể.
Letharion

Câu trả lời:


4

Tôi không nghĩ có API chính thức; Nói chung không có ý nghĩa gì để làm điều này.

Điều đó nói rằng, tất cả các bạn cần làm là cung cấp cho bạn hook_schemamột tên khác nhau hơn yourmodule_schema(về cơ bản bất cứ điều gì bạn muốn, như yourmodule_schema_otherdb) và sau đó trong hook_install (), lần đầu tiên chuyển đổi cơ sở dữ liệu của bạn , sau đó tái tạo những gì drupal_install_schema () không ngoại trừ việc bạn gọi định nghĩa giản đồ tùy chỉnh của bạn chức năng và sau đó chuyển cơ sở dữ liệu trở về mặc định.

Ngoài ra, hãy nhớ thực hiện hook_uninstall().

Không biết tại sao bạn muốn làm điều này, mặc dù. :)


Mục đích (trong trường hợp này) là shending, nhưng tôi có thể nghĩ ra rất nhiều lý do hợp lệ bạn sẽ làm điều này. Cho biết có bao nhiêu rắc rối sẽ xảy ra xung quanh sự thiếu sót này, tôi nghĩ rằng cuối cùng tôi sẽ chỉ viết một buch CREATE TABLEtuyên bố cho việc này.
mikl

Bạn cũng cần phải viết hook_uninstall () tương ứng nếu bạn muốn thực hiện đúng :) Không chắc chắn tôi thấy những rắc rối bạn đang nói, tất cả những gì bạn cần làm là triển khai hook_enable (bạn phải làm trong 6 .x cũng vậy) và sao chép và điều chỉnh một vài dòng mã trong drupal_install_schema (). Đặc biệt nếu bạn muốn các bảng của mình hiển thị trong nhiều cơ sở dữ liệu, bạn thậm chí có thể sử dụng hook_schema () để có nó trong cơ sở dữ liệu mặc định và trong hook_install () cũng làm điều đó cho các cơ sở dữ liệu khác. Thậm chí, bạn có thể chỉ cần gọi drupal_install_schema ($ yourmodule) giữa việc chuyển db.
Berdir

11

Tôi đã đạt được điều này với thông tin được cung cấp bởi Berdir . Mã của tôi trông như:

<?php
function mymodule_schema_otherdb() {
  $schema['mytable'] = array(
    'description' => 'My table description',
    'fields' => array(
      'myfield' => array(
        'description' => 'My field description',
        'type' => 'serial',
        'size' => 'medium',
        'not null' => TRUE,
        'unsigned' => TRUE,
      ),
    ),
    'primary key' => array('myfield'),
  );
  return $schema;
}

function mymodule_install() {
  db_set_active('otherdb');
  $schema = mymodule_schema_otherdb();
  foreach ($schema as $name => $table) {
    db_create_table($name, $table);
  }
  db_set_active();
}

function mymodule_uninstall() {
  db_set_active('otherdb');
  $schema = mymodule_schema_otherdb();
  foreach ($schema as $name => $table) {
    db_drop_table($name);
  }
  db_set_active();
}

Sẽ không quá nhiều công việc để có được một mô-đun tìm kiếm cái móc đó và kích hoạt cài đặt và gỡ cài đặt. với db khác là chìa khóa của cấu trúc lược đồ
Jeremy French

@JeremyFbler, thiết lập này có yêu cầu cơ sở dữ liệu trống được tạo trước không? Tôi đang giả sử như vậy.
zbest

1

Một phiên bản Drupal 8 của tệp * .install được cung cấp bởi @ ЕЕннн.:

Lưu ý: Cơ sở dữ liệu phải tồn tại và được chỉ định trong settings.php.

<?php
function mymodule_schema_otherdb() {
  $schema['mytable'] = array(
    'description' => 'My table description',
    'fields' => array(
      'myfield' => array(
        'description' => 'My field description',
        'type' => 'serial',
        'size' => 'medium',
        'not null' => TRUE,
        'unsigned' => TRUE,
      ),
    ),
    'primary key' => array('myfield'),
  );
  return $schema;
}

/**
 * Implements hook_install().
 */
function mymodule_install() {
  \Drupal\Core\Database\Database::setActiveConnection('otherdb');
  $connection = \Drupal\Core\Database\Database::getConnection();

  $schema = mymodule_schema_shared();
  foreach ($schema as $name => $table) {
    $connection->schema()->createTable($name, $table);
  }

  \Drupal\Core\Database\Database::setActiveConnection();
}

/**
 * Implements hook_uninstall().
 */
function mymodule_uninstall() {
  \Drupal\Core\Database\Database::setActiveConnection('otherdb');
  $connection = \Drupal\Core\Database\Database::getConnection();

  $schema = mymodule_schema_shared();
  foreach ($schema as $name => $table) {
    $connection->schema()->dropTable($name);
  }

  \Drupal\Core\Database\Database::setActiveConnection();
}

Dưới đây là một Gist .


-2

Trong tập tin settings.php
$db_url=array('default'=>$db_url, 'sec_db'=>$sec_db_url);
Trong hook_schema db_set_active('sec_db')bây giờ sẽ kết nối đến một DB của bạn, không chắc chắn nếu điều này được khuyến khích hay không thử nó có nguy cơ của riêng bạn. Và bạn có thể sử dụng db_prefix để truy vấn từ DB thứ cấp này. Bạn có thể sử dụng tiền tố db trong settings.php


Tuy nhiên, đó sẽ là hệ thống rộng, điều mà OP có thể làm
Clive

hệ thống sẽ là gì? vui lòng làm rõ
GoodSp33d

1
Các ngữ nghĩa này ( $db_url, $db_prefixnhư một cài đặt toàn cầu dành cho Drupal 6. Và ký hiệu chấm chỉ hoạt động khi sử dụng một cơ sở dữ liệu khác nhau trên cùng một máy chủ MySQL, chứ không phải khi (như trong trường hợp của tôi) bạn đang truy cập các máy chủ khác nhau.
mikl

@kantu OP đang hỏi cách thay đổi cơ sở dữ liệu cho một bảng cụ thể. Giải pháp ban đầu của bạn (trước khi bạn chỉnh sửa) sẽ tạo ra sự thay đổi toàn hệ thống, chứ không phải trên cơ sở từng bảng.
Clive

2
Và như tôi đã đề cập trước đây, không có $db_urlhoặc một $db_prefixbiến toàn cầu trong Drupal 7, và thậm chí nếu có, nó sẽ không giải quyết được vấn đề.
mikl
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.