Şemamın hangi veritabanında oluşturulması gerektiğini nasıl belirleyebilirim?


12

Drupal 7'de birden çok veritabanı kullanırken , bir tablonun farklı bir sunucudaki farklı bir veritabanında oluşturulacağını nasıl belirleyebilirim?

Varsayılan olarak, bir modül yüklediğinizde Drupal, içindeki her şeyin hook_schema()varsayılan veritabanına yüklenmesi gerektiğini varsayar . Bir tablonun farklı bir veritabanında oluşturulması gerektiğini belirtmenin bir yolu var mı, yoksa kullanabileceğim bir tür manuel geçici çözüm var mı?


İlk düşüncem, bunu API düzeyinde yapamayacağınızdır. Bunun nedeni modülünüzün belirli ve nadir bir veritabanı yapılandırmasına bağlı olmasıdır. Bunun siteye özgü bir modül olduğunu varsayıyorum? Düzeltmenizin site / db-yapılandırmaya özel olması gerektiğine inanıyorum.
Letharion

Yanıtlar:


4

Resmi bir API olduğunu düşünmüyorum; genel olarak bunu yapmak pek mantıklı değil.

Bununla birlikte, yapmanız gereken tek şey (temel olarak istediğiniz gibi ) ve sonra hook_install () ' hook_schemadan farklı bir ad vermek , önce veritabanınızı değiştirmek , sonra özel şema tanımınızı çağırmanız dışında drupal_install_schema ()' nin ne yaptığını çoğaltmaktır. işlevini seçin ve veritabanını varsayılan değere döndürün.yourmodule_schemayourmodule_schema_otherdb

Ayrıca, uygulamayı unutmayın hook_uninstall().

Yine de bunu neden yapmak istediğine dair bir fikrim yok. :)


Amaç (bu durumda) parçalanıyor, ancak bunu yapmak için geçerli birçok neden düşünebilirim. Bu eksikliğin ne kadar sorun yaratacağı düşünüldüğünde, bunun için sadece bir demet CREATE TABLEaçıklama yazacağım .
mikl

Eğer düzgün yapmak istiyorsanız da karşılık gelen hook_uninstall () yazmanız gerekir :) Bahsettiğiniz sorunları gördüğümden emin değilim, yapmanız gereken tek şey hook_enable (6 .x) ekleyin ve drupal_install_schema () içindeki birkaç kod satırını kopyalayıp ayarlayın. Özellikle tablolarınızın birden çok veritabanında görünmesini istiyorsanız, hook_schema () yöntemini varsayılan veritabanında ve hook_install () dizininde de diğer veritabanları için de kullanabilirsiniz. Hatta db arasında geçiş yapmak için drupal_install_schema ($ yourmodule) 'u da arayabilirsiniz.
Berdir

11

Bunu Berdir'in sağladığı bilgilerle başardım . Kodum şöyle görünüyor:

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

Bu kancayı arayan ve yükleme ve kaldırma sırasında ateş eden bir modül almak çok fazla iş olmaz. diğer db şema yapısının anahtarıdır
Jeremy French

@JeremyFrench, bu kurulum için boş veritabanının önceden oluşturulması gerekiyor mu? Sanırım öyle.
zkent

1

Bir Drupal 8 * .install dosya sürümü kodu Елин İ @ tarafından sağlanan .:

Not: Veritabanı mevcut olmalı ve settings.php dosyasında belirtilmelidir.

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

İşte bir öz .


-2

Settings.php
$db_url=array('default'=>$db_url, 'sec_db'=>$sec_db_url);
In'de hook_schema db_set_active('sec_db')şimdi başka bir DB'nize bağlanacak, bunun tavsiye edilip edilmediğinden emin değilsiniz veya kendi sorumluluğunuzdadır. Ve bu ikincil DB sorgulamak için db_prefix kullanabilirsiniz. Db önekini settings.php içinde kullanabilirsiniz.


Bu OP'nin zaten yapabileceği sistem çapında olurdu
Clive

sistem çapında ne olurdu? lütfen açıklayın
GoodSp33d

1
Bu semantik ( $db_url, $db_prefixglobal ayar olarak Drupal 6. içindir Ve değilken (farklı sunuculara erişen ediyoruz) benim durumumda aynı MySQL sunucusundaki farklı bir veritabanı kullanırken nokta notasyonu çalışır.
Mikl

@kantu OP, belirli bir tablo için veritabanının nasıl değiştirileceğini soruyor. Orijinal çözümünüz (düzenlemeden önce) değişikliği tablo bazında değil, sistem çapında yapardı.
Clive

2
Daha önce de belirttiğim gibi , Drupal 7'de $db_urlküresel bir $db_prefixdeğişken yok veya küresel bir değişken yok ve olsa bile, sorunu çözmezdi.
mikl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.