Як я можу вказати, в якій базі даних повинна бути створена моя схема?


12

Як використовувати декілька баз даних в Drupal 7, як я можу вказати, що таблиця повинна бути створена в іншій базі даних на іншому сервері?

За замовчуванням під час встановлення модуля Drupal передбачає, що все, що hook_schema()потрібно, повинно бути встановлено в базі даних за замовчуванням. Чи є спосіб вказати, що таблиця повинна бути створена в іншій базі даних, або я можу використати якесь ручне вирішення?


Моя початкова думка полягає в тому, що ви не можете цього зробити на рівні API. Причина в тому, що ваш модуль буде прив’язаний до конкретної та рідкісної конфігурації бази даних. Я припускаю, що це специфічний для сайту модуль? Я вважаю, що для виправлення також потрібно вказати конфігурацію сайту / db.
Летаріон

Відповіді:


4

Я не думаю, що існує офіційний API; взагалі не має сенсу робити це.

З цього приводу все, що вам потрібно зробити, - hook_schemaце назвати інше ім’я, ніж yourmodule_schema(в основному все, що ви хочете, як yourmodule_schema_otherdb), а потім у moll_install (), спочатку перемкніть свою базу даних , а потім повторіть те, що робить drupal_install_schema () , за винятком того, що ви називаєте свою власну схему визначення функцію, а потім повернути базу даних до стандартної.

Крім того, не забудьте здійснити hook_uninstall().

Не маю ідеї, чому ви хочете це зробити. :)


Мета (в даному випадку) - загострення, але я можу придумати багато поважних причин, якими ви це зробите. Зважаючи на те, скільки клопоту було б вирішити цей недолік, я думаю, що в кінцевому підсумку я просто напишу купу CREATE TABLEтверджень щодо цього.
mikl

Для цього вам потрібно буде написати відповідний kuk_uninstall (), а також якщо ви хочете зробити це належним чином :) Не впевнений, що я бачу неприємності, про які ви говорите, все, що вам потрібно зробити, це здійснити гачку_enable (що вам довелося зробити в 6 .x також) та скопіюйте та відрегулюйте кілька рядків коду в drupal_install_schema (). Особливо, якщо ви хочете, щоб ваші таблиці відображалися в декількох базах даних, ви можете навіть використовувати kuka_schema (), щоб це було в базі даних за замовчуванням, а в куки_встановити () це робити і для інших баз даних. Можливо, ви навіть зможете просто зателефонувати на drupal_install_schema ($ yourmodule) між комутацією db.
Бердір

11

Я домігся цього завдяки інформації, наданій Бердіром . Мій код виглядає так:

<?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();
}

Було б не надто багато роботи, щоб отримати модуль, який шукає цей гачок і запускається при встановленні та видаленні. інший db є ключовою структурою схеми
Джеремі Френч

@JeremyFrench, чи потрібно для цієї установки заздалегідь створити порожню базу даних? Я припускаю, що так.
zkent

1

Drupal 8 версії * .install файл код , наданий @ Елін.: Я

Примітка: База даних повинна існувати і бути вказаною в 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();
}

Ось істота .


-2

Тепер у Settings.php
$db_url=array('default'=>$db_url, 'sec_db'=>$sec_db_url);
In hook_schema db_set_active('sec_db')підключиться до іншої БД, не впевнений, рекомендується це чи не спробувати на власний ризик. І ви можете використовувати db_prefix для запиту з цього вторинного БД. Ви можете використовувати префікс db у settings.php


Це було б все-таки системою, що вже може зробити ОП
Клайв

яка б була система? уточнюйте, будь ласка
GoodSp33d

1
Ця семантика ( $db_url, $db_prefixяк глобальні настройки призначена для Drupal 6. І дот-нотація працює тільки при використанні іншої бази даних на одному сервері MySQL, а не колись (як в моєму випадку) ви доступ до різних серверів.
Mikl

@kantu OP запитує, як змінити базу даних для певної таблиці. Ваше оригінальне рішення (до того, як ви редагувались) змінило б систему в цілому, а не на основі таблиці.
Клайв

2
І як я вже згадував, у Drupal 7 немає $db_urlабо глобальної $db_prefixзмінної, і навіть якби вони були, це не вирішило б проблеми.
mikl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.