मैं यह कैसे निर्दिष्ट करूँ कि मेरा स्कीमा किस डेटाबेस में बनाया जाए?


12

Drupal 7 में कई डेटाबेस का उपयोग करते समय , मैं यह कैसे निर्दिष्ट कर सकता हूं कि एक अलग सर्वर पर एक अलग डेटाबेस में एक तालिका बनाई जानी है?

डिफ़ॉल्ट रूप से, जब आप एक मॉड्यूल स्थापित करते हैं, तो Drupal मानता है कि hook_schema()डिफ़ॉल्ट डेटाबेस में सब कुछ स्थापित होना चाहिए। क्या यह निर्दिष्ट करने का कोई तरीका है कि एक अलग डेटाबेस पर एक तालिका बनाई जानी चाहिए, या क्या मैं किसी प्रकार का मैनुअल वर्कअराउंड उपयोग कर सकता हूं?


मेरा प्रारंभिक विचार यह है कि आप एपीआई स्तर पर ऐसा नहीं कर सकते। कारण यह है कि आपका मॉड्यूल एक विशिष्ट और दुर्लभ डेटाबेस कॉन्फ़िगरेशन से बंधा होगा। मुझे लगता है कि यह एक साइट विशिष्ट मॉड्यूल है? मुझे विश्वास है कि आपके फिक्स को भी साइट / डीबी-कॉन्फ़िगरेशन विशिष्ट होना चाहिए।
०५:०१

जवाबों:


4

मुझे नहीं लगता कि कोई आधिकारिक एपीआई है; यह सामान्य रूप से ऐसा करने का कोई मतलब नहीं है।

उस ने कहा, आपको केवल अपना hook_schemaअलग नाम देने की ज़रूरत है yourmodule_schema(मूल रूप से जो आप चाहते हैं, जैसे yourmodule_schema_otherdb) और फिर हुक_ इंस्टॉलेशन () में, पहले अपने डेटाबेस को स्विच करें , फिर दोहराएं कि ड्रुपल_इंस्टाल_कासा () क्या करता है सिवाय इसके कि आप अपनी कस्टम स्कीमा परिभाषा दें फ़ंक्शन और फिर डेटाबेस को डिफ़ॉल्ट पर वापस स्विच करें।

इसके अलावा, लागू करने के लिए याद रखें hook_uninstall()

कोई विचार नहीं कि आप ऐसा क्यों करना चाहते हैं, हालांकि। :)


उद्देश्य (इस मामले में) पैनापन है, लेकिन मैं बहुत सारे वैध कारणों के बारे में सोच सकता हूं जो आप ऐसा करेंगे। यह देखते हुए कि इस कमी को पूरा करने में कितनी परेशानी होगी, मुझे लगता है कि मैं इसके लिए केवल कुछ CREATE TABLEकथन लिखूंगा ।
मिकल

जिसके लिए आपको संबंधित hook_uninstall () लिखना होगा साथ ही यदि आप इसे ठीक से करना चाहते हैं :) मुझे यकीन नहीं है कि आप जिन परेशानियों के बारे में बात कर रहे हैं, आपको हुक_ जेनबल (जो आपको 6 में करना था) लागू करना होगा .x साथ ही) और drupal_install_schema () में कोड की कुछ पंक्तियों को कॉपी और समायोजित करें। विशेष रूप से यदि आप चाहते हैं कि आपकी तालिकाएँ कई डेटाबेस में दिखाई दें, तो आप इसे डिफ़ॉल्ट डेटाबेस में हुक_केम () का भी उपयोग कर सकते हैं और हुक_ इंस्टॉलेशन में भी अन्य डेटाबेस के लिए भी कर सकते हैं। तुम भी बस स्विच करने के बीच drupal_install_schema ($ yourmodule) को कॉल करने में सक्षम हो सकता है।
बर्दिर

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

यह एक मॉड्यूल पाने के लिए बहुत अधिक काम नहीं होगा जो कि हुक के लिए दिखता है और इंस्टॉल और अनइंस्टॉल पर आग लगाता है। स्कीमा संरचना की एक अन्य डीबी होने के साथ
जेरेमी फ्रेंच

@JeremyFrench, क्या इस सेटअप को पहले से खाली डेटाबेस बनाने की आवश्यकता है? मैं ऐसा मान रहा हूं।
zkent

1

* Codeлин version द्वारा प्रदत्त * । स्थापना फ़ाइल कोड का एक Drupal 8 संस्करण :

नोट: डेटाबेस मौजूद होना चाहिए और सेटिंग्स में निर्दिष्ट किया जाना चाहिए। पीपी।

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

यहाँ एक Gist है


-2

Settings.php
$db_url=array('default'=>$db_url, 'sec_db'=>$sec_db_url);
में hook_schema db_set_active('sec_db')अब आपके दूसरे DB से जुड़ेंगे, यह सुनिश्चित नहीं है कि यह अनुशंसित है या अपने जोखिम पर इसका प्रयास न करें। और आप इस द्वितीयक DB से क्वेरी के लिए db_prefix का उपयोग कर सकते हैं। आप settings.php में db उपसर्ग का उपयोग कर सकते हैं


यही कारण है कि सिस्टम होगा विस्तृत हालांकि, जो पहले से ही ओ पी कर सकते हैं
क्लाइव

क्या सिस्टम चौड़ा होगा? कृपया स्पष्ट करें
GoodSp33d

1
ये शब्दार्थ ( $db_url, $db_prefixएक वैश्विक सेटिंग के रूप में Drupal 6 के लिए हैं। और डॉट-नोटेशन केवल एक ही MySQL सर्वर पर एक अलग डेटाबेस का उपयोग करते समय काम करता है, न कि तब (जब मेरे मामले में) आप अलग-अलग सर्वरों का उपयोग कर रहे हों।
mikl

@kantu ओपी पूछ रहा है कि एक विशिष्ट तालिका के लिए डेटाबेस को कैसे बदलना है। आपके मूल समाधान (आपके द्वारा संपादित किए जाने से पहले) ने सिस्टम को व्यापक बना दिया होगा, न कि टेबल-टेबल के आधार पर।
क्लाइव

2
और जैसा कि मैंने पहले उल्लेख किया है, ड्रुपल 7 में $db_urlकोई वैश्विक $db_prefixचर नहीं है , और यहां तक ​​कि अगर वहाँ थे, तो यह समस्या को हल नहीं करेगा।
मिकाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.