मैं कई डेटाबेस कनेक्शन कैसे सेट कर सकता हूं?


12

क्या कोई मुझे Drupal 8 में कई डेटाबेस कनेक्शन के साथ कनेक्शन स्थापित करने में मदद कर सकता है? मेरे पास एक ही सर्वर पर डेटाबेस है और मैं इसे डिफ़ॉल्ट Drupal 8 डेटाबेस के साथ एक्सेस करना चाहता हूं।


डेटाबेस जानकारी को अपनी सेटिंग में जोड़ें।

हाय @IvanJaros कृपया इसे एक उत्तर के रूप में जोड़ने पर विचार करें क्योंकि यह प्रश्न का उत्तर देता है।
डिजिटल

जवाबों:


13

यह उसी तरह से किया जाता है जैसे कि ड्रुपल 7 में, आप अपनी सेटिंग्स में डेटाबेस क्रेडेंशियल्स जोड़ सकते हैं। फाइल।

$databases['default']['default'] = array(
  'database' => 'drupal8',
  'username' => 'username',
  'password' => 'password',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);

$databases['external']['default'] = array(
  'database' => 'external',
  'username' => 'username',
  'password' => 'password',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);

अब आपके पास दो कनेक्शन विकल्प होंगे, डिफ़ॉल्ट और बाहरी। आप उन दोनों के बीच स्विच कर सकते हैं:

// Switch to external database
\Drupal\Core\Database\Database::setActiveConnection('external');
// Do queries...

// Switch back
\Drupal\Core\Database\Database::setActiveConnection();

आप कहां से ये स्विच कर रहे होंगे ... उदाहरण के लिए स्थानीय से उत्पादन तक।
TikaL13

@ TikaL13 जब आप को लाने की जरूरत है / बाहर के स्रोत से डेटा लाने के लिए / और जब आप भ्रूण के साथ किया जाता है तब आप वापस स्विच करते हैं।
गोगलटॉर्प

@googletorp जब बाहरी डेटाबेस आंतरिक सर्वर त्रुटि 500 ​​से उपलब्ध नहीं है। IDK ड्रुपल बूटस्ट्रैप और क्या पर संबंध बनाने की कोशिश कर रहा है। कैसे इनायत छोड़ सकते हैं? बहुत बहुत धन्यवाद
मुदस्सर अली

@MudassarAli आप एक कोशिश / कैच स्टेटमेंट में कुछ करने में सक्षम हो सकते हैं जहां आप वास्तव में डेटाबेस स्विच करते हैं। यह एक त्रुटि मैं से परिचित हूँ नहीं है, हालांकि इतना यकीन नहीं क्या होता है
googletorp

1
सक्रिय कनेक्शन को बदलना आवश्यक नहीं है। इसके बजाय, Database::getConnection('external')वैश्विक राज्य के साथ खिलवाड़ करने से बचें।
पियरे ब्यूले

5

उपयोग करने वाले बाहरी डेटाबेस के लिए एक डेटाबेस कनेक्शन को पुनः प्राप्त करने के अलावा Database::getConnection(), आप कनेक्शन को एक निर्भरता के रूप में प्राप्त करने के लिए अपने कोड में निर्भरता इंजेक्शन का उपयोग भी कर सकते हैं और एक मॉड्यूल की सेवाओं में अपने कनेक्शन की घोषणा कर सकते हैं YAML फ़ाइल:

database.external:
  class: Drupal\Core\Database\Connection
  factory: 'Drupal\Core\Database\Database::getConnection'
  arguments: ['external']

external_database_dependent_service:
  class: Drupal\MODULE\Some\Class\For\A\ServiceUsingTheExternalDatabase
  arguments: ['@database.external']

यह एक अच्छी चाल है, लेकिन आपको वास्तव में प्रश्नों को स्वयं करने की आवश्यकता है। यह अभ्यस्त काम है अगर आपको ड्रुपल आंतरिक कार्यों को लोडिंग संस्थाओं और बचत संस्थाओं की तरह सामान करने की आवश्यकता है। (Fx साइटों अगर सामग्री प्रकार साझा किया है)
googletorp

Drupal का DB Drupal द्वारा प्रबंधित किया जाता है, इकाई प्रणाली आपके अधिकांश सामग्री तालिकाओं का प्रबंधन करती है। डेटाबेस स्तर पर सामग्री साझा करने के लिए ड्रुपल नहीं बनाया गया है। ऐसा करना बहुत नाजुक लगता है (यानी। मैं बहुत सी चीजों पर निर्भर करता हूं जिन्हें आप नियंत्रित नहीं कर सकते हैं)। अल्फा में भी, drupal.org/project/replication जैसा कुछ ज्यादा सुरक्षित लगता है।
पियरे ब्यूले

1
यह एक उत्कृष्ट समाधान है, लेकिन मैंने देखा कि कम से कम 8.3 के रूप में आपको मेरी अपेक्षा से उल्टे क्रम में कनेक्शन कारखाने को दो पैरामीटर प्रदान करने की आवश्यकता है: तर्क: ['डिफ़ॉल्ट', 'बाहरी']
acrosman

2

बहुत बहुत धन्यवाद, @googletorp!

यहाँ एक और अधिक पूर्ण उदाहरण है - D7 डेटाबेस से उन उपयोगकर्ताओं को चुनने के लिए मेरा कोड जिन्होंने नोड बनाए हैं:

\Drupal\Core\Database\Database::setActiveConnection('external');

// Get a connection going
$db = \Drupal\Core\Database\Database::getConnection();

$query = $db->select('users', 'u');
$query->fields('u', array('uid', 'name'));
$query->join('node', 'n', 'n.uid = u.uid');
$query->orderBy('uid');
$users = $query->execute()->fetchAllKeyed();

\Drupal\Core\Database\Database::setActiveConnection();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.