Bagaimana cara menentukan di basis data mana skema saya harus dibuat?


12

Saat menggunakan beberapa basis data di Drupal 7, bagaimana saya bisa menentukan bahwa sebuah tabel akan dibuat di database yang berbeda di server yang berbeda?

Secara default, ketika Anda menginstal modul, Drupal mengasumsikan bahwa semua yang ada di hook_schema()dalamnya harus diinstal dalam database default. Apakah ada cara untuk menentukan bahwa tabel harus dibuat pada database yang berbeda, atau adakah semacam solusi manual yang dapat saya gunakan?


Pikiran awal saya adalah bahwa Anda tidak dapat melakukan ini di tingkat API. Alasannya adalah bahwa modul Anda akan diikat ke konfigurasi database yang spesifik dan langka. Saya menganggap ini adalah modul khusus situs? Saya yakin perbaikan Anda juga harus spesifik situs / db-konfigurasi.
Letharion

Jawaban:


4

Saya tidak berpikir ada API resmi; tidak masuk akal untuk melakukan ini secara umum.

Yang mengatakan, semua yang perlu Anda lakukan adalah memberikan hook_schemanama yang berbeda dari yourmodule_schema(pada dasarnya apa pun yang Anda inginkan, seperti yourmodule_schema_otherdb) dan kemudian di hook_install (), pertama-tama beralih database Anda , kemudian meniru apa yang drupal_install_schema () lakukan kecuali Anda memanggil definisi skema kustom Anda berfungsi dan kemudian alihkan database kembali ke default.

Juga, ingatlah untuk menerapkan hook_uninstall().

Tidak tahu mengapa Anda ingin melakukan ini. :)


Tujuannya (dalam hal ini) sangat buruk, tetapi saya dapat memikirkan banyak alasan yang sah untuk melakukan ini. Mengingat betapa sulitnya mengatasi kekurangan ini, saya pikir saya akan berakhir hanya menulis CREATE TABLEpernyataan untuk ini.
mikl

Untuk itu Anda perlu menulis hook_uninstall () yang sesuai juga jika Anda ingin melakukannya dengan benar :) Tidak yakin saya melihat masalah yang Anda bicarakan, semua yang perlu Anda lakukan adalah menerapkan hook_enable (yang harus Anda lakukan dalam 6 .x juga) dan salin dan sesuaikan beberapa baris kode di drupal_install_schema (). Terutama jika Anda ingin tabel Anda muncul di banyak database, Anda bahkan dapat menggunakan hook_schema () untuk memilikinya di database default dan di hook_install () melakukannya untuk database lain juga. Anda bahkan dapat memanggil drupal_install_schema ($ yourmodule) di antara beralih db.
Berdir

11

Saya telah mencapai ini dengan informasi yang diberikan oleh Berdir . Kode saya terlihat seperti:

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

Tidak akan terlalu sulit untuk mendapatkan modul yang mencari kait itu dan menginstal dan menghapus instalan. dengan db lain menjadi kunci dari struktur skema
Jeremy French

@JeremyFrench, apakah pengaturan ini memerlukan database yang kosong harus dibuat sebelumnya? Saya berasumsi begitu.
zkent

1

Versi Drupal 8 dari kode file * .install disediakan oleh @ Елин Й .:

Catatan: Basis data harus ada dan ditentukan di 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();
}

Inilah intinya .


-2

Di Settings.php
$db_url=array('default'=>$db_url, 'sec_db'=>$sec_db_url);
In hook_schema db_set_active('sec_db')sekarang akan terhubung ke DB Anda yang lain, tidak yakin apakah ini direkomendasikan atau tidak mencobanya dengan risiko Anda sendiri. Dan Anda dapat menggunakan db_prefix untuk meminta dari DB sekunder ini. Anda dapat menggunakan awalan db di settings.php


Itu akan menjadi sistem luas, yang OP sudah bisa lakukan
Clive

apa yang akan menjadi sistem lebar? tolong klarifikasi
GoodSp33d

1
Semantik ini ( $db_url, $db_prefixsebagai pengaturan global untuk Drupal 6. Dan notasi titik hanya berfungsi ketika menggunakan database berbeda pada server MySQL yang sama, bukan ketika (seperti dalam kasus saya) Anda mengakses server yang berbeda.
mikl

@kantu OP menanyakan cara mengubah database untuk tabel tertentu. Solusi asli Anda (sebelum diedit) akan membuat perubahan di seluruh sistem, bukan berdasarkan tabel-per-tabel.
Clive

2
Dan seperti yang saya sebutkan sebelumnya, tidak ada $db_urlatau $db_prefixvariabel global dalam Drupal 7, dan bahkan jika ada, itu tidak akan menyelesaikan masalah.
mikl
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.