ฉันจะระบุสคีมาที่ฐานข้อมูลของฉันควรสร้างได้อย่างไร


12

เมื่อใช้หลายฐานข้อมูลใน Drupal 7 ฉันจะระบุว่าจะสร้างตารางในฐานข้อมูลอื่นบนเซิร์ฟเวอร์อื่นได้อย่างไร

ตามค่าเริ่มต้นเมื่อคุณติดตั้งโมดูล Drupal จะถือว่าทุกสิ่งในhook_schema()นั้นควรได้รับการติดตั้งในฐานข้อมูลเริ่มต้น มีวิธีระบุว่าควรสร้างตารางในฐานข้อมูลอื่นหรือมีวิธีแก้ปัญหาด้วยตนเองบางประเภทที่ฉันสามารถใช้ได้หรือไม่?


ความคิดเริ่มต้นของฉันคือคุณไม่สามารถทำได้ในระดับ API เหตุผลที่โมดูลของคุณจะเชื่อมโยงกับการกำหนดค่าฐานข้อมูลเฉพาะและหายาก ฉันถือว่านี่เป็นโมดูลเฉพาะไซต์หรือไม่ ฉันเชื่อว่าการแก้ไขของคุณจะต้องเฉพาะ site / db-configuration ด้วย
Letharion

คำตอบ:


4

ฉันไม่คิดว่าจะมี API อย่างเป็นทางการ โดยทั่วไปแล้วการทำเช่นนี้ไม่สมเหตุสมผล

ที่กล่าวว่าสิ่งที่คุณต้องทำคือให้hook_schemaชื่อที่แตกต่างจากyourmodule_schema(โดยทั่วไปสิ่งที่คุณต้องการเช่นyourmodule_schema_otherdb) จากนั้นใน hook_install () ให้สลับฐานข้อมูลของคุณก่อนจากนั้นทำซ้ำว่าdrupal_install_schema ()ทำอะไรยกเว้นว่าคุณเรียกข้อกำหนดสคีมา ฟังก์ชันจากนั้นสลับฐานข้อมูลกลับไปเป็นค่าเริ่มต้น

hook_uninstall()ยังจำได้ในการดำเนินการ

ไม่มีความคิดว่าทำไมคุณถึงต้องการทำเช่นนี้ :)


จุดประสงค์ (ในกรณีนี้) กำลังปัดฝุ่น แต่ฉันสามารถนึกถึงเหตุผลที่ถูกต้องมากมายที่คุณต้องทำ เมื่อพิจารณาถึงปัญหาที่จะแก้ไขข้อบกพร่องนี้ฉันคิดว่าฉันจะจบลงด้วยการเขียนCREATE TABLEคำแถลงเกี่ยวกับเรื่องนี้
mikl

ซึ่งคุณจะต้องเขียน hook_uninstall ที่สอดคล้องกัน () และถ้าคุณต้องการที่จะทำอย่างถูกต้อง :) ไม่แน่ใจว่าฉันเห็นปัญหาที่คุณกำลังพูดถึงสิ่งที่คุณต้องทำคือการใช้ hook_enable (ซึ่งคุณต้องทำใน 6 .x เช่นกัน) และคัดลอกและปรับรหัสสองสามบรรทัดใน drupal_install_schema () โดยเฉพาะอย่างยิ่งถ้าคุณต้องการให้ตารางของคุณแสดงในหลายฐานข้อมูลคุณสามารถใช้ hook_schema () เพื่อใช้ในฐานข้อมูลเริ่มต้นและใน hook_install () ทำเพื่อฐานข้อมูลอื่นเช่นกัน คุณอาจจะสามารถเรียก drupal_install_schema ($ yourmodule) ระหว่างการสลับ db
Berdir

11

ฉันได้ประสบความสำเร็จนี้มีข้อมูลที่ได้รับจากBerdir รหัสของฉันดูเหมือนว่า:

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

มันจะไม่ทำงานมากเกินไปที่จะได้รับโมดูลที่ค้นหา hook และ fires ในการติดตั้งและถอนการติดตั้ง กับฐานข้อมูลอื่น ๆ ที่เป็นกุญแจสำคัญของโครงสร้างสคี
Jeremy French

@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);
ในhook_schema db_set_active('sec_db')ตอนนี้จะเชื่อมต่อกับฐานข้อมูลอื่นของคุณไม่แน่ใจว่าสิ่งนี้ได้รับการแนะนำหรือไม่ลองด้วยความเสี่ยงของคุณเอง และคุณสามารถใช้ db_prefix เพื่อเคียวรีจาก DB รองนี้ คุณสามารถใช้คำนำหน้า db ใน settings.php


นั่นจะเป็นระบบที่กว้างซึ่ง OP สามารถทำได้
ไคลฟ์

ระบบกว้างอะไร โปรดชี้แจง
GoodSp33d

1
ความหมายเหล่านี้ ( $db_url, $db_prefixเป็นตั้งค่าส่วนกลางสำหรับ Drupal 6 และจุดสัญกรณ์ทำงานเฉพาะเมื่อใช้ฐานข้อมูลที่แตกต่างกันบนเซิร์ฟเวอร์ MySQL เดียวกันไม่ได้เมื่อ (เช่นในกรณีของฉัน) คุณเข้าถึงเซิร์ฟเวอร์ที่แตกต่างกัน.
mikl

@kantu OP ขอให้วิธีการเปลี่ยนฐานข้อมูลสำหรับตารางเฉพาะ โซลูชันดั้งเดิมของคุณ (ก่อนที่คุณจะแก้ไข) จะทำให้การเปลี่ยนแปลงทั่วทั้งระบบไม่ใช่แบบทีละตาราง
ไคลฟ์

2
และอย่างที่ฉันได้พูดไปก่อนหน้านี้ไม่มีตัวแปร$db_urlทั่วโลก$db_prefixใน Drupal 7 และแม้ว่าจะมีก็ไม่สามารถแก้ปัญหาได้
mikl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.