스키마를 만들 데이터베이스를 어떻게 지정합니까?


12

Drupal 7에서 여러 데이터베이스 를 사용할 때 다른 서버의 다른 데이터베이스에 테이블을 만들도록 어떻게 지정할 수 있습니까?

기본적으로, 모듈을 설치할 때 Drupal은 모든 것을 hook_schema()기본 데이터베이스에 설치해야 한다고 가정 합니다. 다른 데이터베이스에서 테이블을 작성하도록 지정하는 방법이 있습니까, 아니면 사용할 수있는 수동 해결 방법이 있습니까?


내 생각은 API 수준 에서이 작업을 수행 할 수 없다는 것입니다. 모듈이 특정하고 드문 데이터베이스 구성에 연결되어 있기 때문입니다. 이것이 사이트 특정 모듈이라고 생각합니까? 귀하의 수정 사항은 사이트 / DB 구성에 따라 달라질 필요가 있다고 생각합니다.
Letharion

답변:


4

공식 API가 없다고 생각합니다. 일반적으로이 작업을 수행하는 것은 의미가 없습니다.

즉, (기본적으로 원하는대로 )와 hook_schema다른 이름 을 지정한 다음 hook_install ()에서 먼저 데이터베이스를 전환 한 다음 사용자 정의 스키마 정의를 호출하는 것을 제외하고 drupal_install_schema () 가 수행하는 것을 복제 하십시오. 기능을 수행 한 다음 데이터베이스를 기본값으로 다시 전환하십시오.yourmodule_schemayourmodule_schema_otherdb

또한 구현해야 hook_uninstall()합니다.

그래도 왜 그렇게하고 싶을 지 모르겠다. :)


목적 (이 경우)은 샤딩이지만, 당신이 이것을 할 많은 정당한 이유를 생각할 수 있습니다. 이 단점을 해결하는 데 얼마나 많은 문제가 있는지를 감안할 때, 나는 이것에 대한 많은 CREATE TABLE진술을 작성하게 될 것이라고 생각 합니다.
mikl

제대로하려는 경우 해당 hook_uninstall ()을 작성해야합니다. drupal_install_schema ()에서 몇 줄의 코드를 복사하고 조정하십시오. 특히 테이블을 여러 데이터베이스에 표시하려는 경우 hook_schema ()를 사용하여 기본 데이터베이스에 있고 hook_install ()에서 다른 데이터베이스에도 사용할 수 있습니다. db를 전환 할 때 drupal_install_schema ($ yourmodule)를 간단히 호출 할 수도 있습니다.
Berdir

11

나는 Berdir이 제공 한 정보로 이것을 달성 했다 . 내 코드는 다음과 같습니다

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

해당 후크를 찾고 설치 및 제거시 실행되는 모듈을 얻는 것은 그리 큰 일이 아닙니다. 다른 db는 스키마 구조의 핵심이됩니다
Jeremy French

@JeremyFrench,이 설정은 빈 데이터베이스를 미리 만들어야합니까? 나는 그렇게 가정하고 있습니다.
zkent 2016 년

1

@ Елин Й.에서 제공 한 * .install 파일 코드Drupal 8 버전 :

참고 : 데이터베이스가 존재하고 settings.php에 지정되어 있어야합니다.

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

여기 요점이 있습니다.


-2

In In Settings.php
$db_url=array('default'=>$db_url, 'sec_db'=>$sec_db_url);
In hook_schema db_set_active('sec_db')은 이제 다른 DB에 연결합니다 . 그리고이 보조 DB에서 쿼리하기 위해 db_prefix를 사용할 수 있습니다. settings.php에서 db 접두사를 사용할 수 있습니다


그것은 OP가 이미 할 수있는 시스템 전체 일 것입니다.
Clive

시스템 전체는 무엇입니까? 명확하게 설명하십시오
GoodSp33d

1
이러한 의미 ( $db_url, $db_prefix전역 설정으로는 드루팔 (6)을위한 것이며,하지 않을 때 (당신이 다른 서버를 액세스하는) 내 경우와 동일한 MySQL 서버의 다른 데이터베이스를 사용하는 경우 도트 표기법에만 작동합니다.
mikl

@kantu OP는 특정 테이블의 데이터베이스를 변경하는 방법을 묻습니다. 원래 솔루션 (편집하기 전)은 테이블 단위가 아니라 시스템 전체에서 변경되었습니다.
Clive

2
그리고 앞에서 언급했듯이 Drupal 7 $db_url에는 전역 $db_prefix변수 가 없거나 글로벌 변수가 있으며, 존재하더라도 문제를 해결하지 못합니다.
mikl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.