Категорії

Підключення до кількох баз даних в Drupal 7

12.11.2011
Автор:

В процесі веб розробки бувають випадки, коли потрібно перенести данні з однієї бази в іншу (експорт,  імпорт даних), і зробити це потрібно якісно і швидко, працюючи в середовищі 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' => '',
    ),
  ),
);

Тепер у наc з'явився новий ключ, який називається "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()
  // 

Цей спосіб дуже підходить у випадку, коли відсутній доступ до 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 Рейтинг: 5

Також по темі

1

У попередньому пості я приводив приклад використання Ctools modal API за допомогою однієї форми. У цьому ж я...

2

Початкова ідея #states полягає в тому, щоб уможливлювати створення динамічних форм без написання JavaScript коду, як такого.

3

XML-RPC –простий протокол виклику віддалених процедур. XML-RPC можна вважати праотцем одного із популярних протоколів SOAP. Попри свій вік (реалізований в 1998 році), XML-RPC не відходить в минуле...

4

В пості ми розкриємо основи створення середовища для розробки Drupal проектів на основі Debian 6 "Squeeze". Маючи дане підгрунтя, кожен зможе попрактикуватись в налаштуванні сервісів ОС.

5

В даній статті на Ваш розгляд буде представлена інформація про можливості платформи Titanium Appcelerator. Також стаття дає можливість познайомитись із частовживаними об'єктами групи Titanium.UI:...

Давайте обговоримо ваш проект у всіх деталях

Шукаєте хороших Drupal-розробників? А ми тут! Яким би ви хотіли бачити проект своєї мрії? Зв’яжіться з нами і розкажіть про це. Із задоволенням втілимо вашу мрію в життя!

Приєднуйтесь до людей, які вже підписалися!

Хочете бути в курсі важливих і цікавих речей, що відбуваються? Ми інформуватимемо Вас про розвиток та нові події в Drupal, дизайні, тестуванні та ін.

Відпишіться у будь-який час