Подключение к нескольким базам данных в Drupal 7

12.11.2011
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin
Автор:

В процессе веб разработки Бывают случаи (экспорта, импорта данных), когда, работая в среде Drupal 7, нужно перенести данные из одной базы в другую,  и сделать это нужно качественно и быстро. Для таких случаев я и написал эту статью. Рассмотрим три способа:

  1. используя Database::getConnection()
  2. используя Database::addConnectionInfo() і db_set_active()
  3. добавляя третий аргумент функции db_select, db_insert, db_update, etc.

Рассмотрим как выглядит settings.php по умолчанию в drupal 7

$databases = array (
  //key
  'default' => 
  array (
    //target
    'default' => 
    array (
      'database' => 'users',
      'username' => 'root',
      'password' => '',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

Как видно из примера выше, у нас есть ключ (key) — default и шаблон (target) — также default. Это подключение к базе drupal 7 использует по умолчанию. Это то подключение, которое мы ставили при установке drupal 7.

Теперь рассмотрим эти способы.

1 . используя Database::getConnection()

Изменения в settings.php

//this is connection by default
$databases = array (
  'default' => 
  array (
    'default' => 
    array (
      'database' => 'users',
      'username' => 'root',
      'password' => '',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
  //this is how the connection to other base is prescribed
  'import' => 
  array (
    'default' => 
    array (
      'database' => 'database',
      'username' => 'root',
      'password' => '',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

Теперь у нас появился новый ключ, который называется "import", и у него есть один шаблон, который называется "default". 

Теперь пишем само соединение:

$import = Database::getConnection($target='default',$key='import');
// into the variable import gets the object which has query method by the help of which we can implement the requests
$result = $import->query($sql,$args,$opts);

Этот способ не лучший, поскольку, когда мы работаем с разнотипными базами, возникает необходимось писать несколько запросов с различным синтаксисом.

2 . используя Database::addConnectionInfo() і db_set_active()

// form massif of connection to other base
$other_database = array(
      'database' => 'databasename',
      'username' => 'username',
      'password' => 'password', 
      'host' => 'localhost', 
      'driver' => 'mysql',
  );
  // after this announce our connection our connection in Database::addConnectionInfo()
  // first parameter is key, the second one - template (target), the third one - masiff with parameters of connection
  Database::addConnectionInfo('YourDatabaseKey', 'default', $other_database);
  // make this connection active
  db_set_active('YourDatabaseKey');

  // all requests that are after db_set_active
  // will adress to the base connection of which we denoted in the parameter db_set_active

  db_set_active(); // to make connection active by default we write the following db_set_active with an empty parameter()

Данный способ очень подходит в случае, когда нет доступа к settings.php

3 . добавляя третий аргумент функции db_select, db_insert, db_update, etc.

Изменения в settings.php

$databases = array (
  'default' => 
  array (
    'default' => 
    array (
      'database' => 'users',
      'username' => 'root',
      'password' => '',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
    'import' => 
    array (
      'database' => 'database',
      'username' => 'root',
      'password' => '',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

Как можно заметить, мы не создавали новый ключ, а добавили новый шаблон (target) в ключ (key) default, потому что следующий наш пример не поддерживает подключение с другими ключами.

Рассмотрим запрос с помощью функции db_select()

// in the db_ select function as the third parameter we transfer masiff where the key will be "target" and the meaning will be the one we prescribed in settings.php, in our case it's "import"
$import = db_select('table', 't', array('target' => 'import'))
  ->fields('t', array('fields1'))
  ->condition('t.fields2', 'field')
  ->condition('t.fielduser', $user->uid)
  ->execute()
  ->fetchAssoc();

На мой взгляд, этот способ самый удобный, ведь мы сразу имеем под рукой подключения, и можем его контролировать в каждом запросе.
Конечно можно использовать mysql_connect () или PDO, но мы говорим о Drupal, в котором это предусмотрено. Таким образом, при условии внимательного изучения вышеизложенного, каждый, в дальнейшем, без проблем сможет работать с различными базами в drupal 7.

1 vote, Rating: 5
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin

Также по теме

1

Сейчас iPhone и iPad, далее iГаджеты, уже давно перестали быть чем-то новым и необычным. У разработчиков, в связи с этим, прибавилось задач, связанных с реализацией...

2

При необходимости перенесения каких-либо изменений в базе с одного сайта на другой, переливание всей базы, как правило, является достаточно проблематичным, а иногда и...

3

С развитием социальных сетей заказчики все чаще хотят интегрировать сайт с Facebook, Twitter, Google+ и т. д. На одном из проектов нужно было реализовать...

4

Опытные друпал-разработчики не представляют своей работы без утилиты Drush (Drupal shell), ведь с её помощью большинство рутинных дейстивий в друпале выполняются намного...

5

Ни для кого не секрет, что Google Analytics (далее - GA) - мощнейший инструмент для сбора данных о действиях...

Need a quote? Let's discuss the project

Are you looking for someone to help you with your Drupal Web Development needs? Let’s get in touch and discuss the requirements of your project. We would love to hear from you.

Join the people who have already subscribed!

Want to be aware of important and interesting things happening? We will inform you about new blog posts on Drupal development, design, QA testing and more, as well news about Drupal events.

No charge. Unsubscribe anytime