Drupal 7에서 여러 데이터베이스 를 사용할 때 다른 서버의 다른 데이터베이스에 테이블을 만들도록 어떻게 지정할 수 있습니까?
기본적으로, 모듈을 설치할 때 Drupal은 모든 것을 hook_schema()
기본 데이터베이스에 설치해야 한다고 가정 합니다. 다른 데이터베이스에서 테이블을 작성하도록 지정하는 방법이 있습니까, 아니면 사용할 수있는 수동 해결 방법이 있습니까?
Drupal 7에서 여러 데이터베이스 를 사용할 때 다른 서버의 다른 데이터베이스에 테이블을 만들도록 어떻게 지정할 수 있습니까?
기본적으로, 모듈을 설치할 때 Drupal은 모든 것을 hook_schema()
기본 데이터베이스에 설치해야 한다고 가정 합니다. 다른 데이터베이스에서 테이블을 작성하도록 지정하는 방법이 있습니까, 아니면 사용할 수있는 수동 해결 방법이 있습니까?
답변:
공식 API가 없다고 생각합니다. 일반적으로이 작업을 수행하는 것은 의미가 없습니다.
즉, (기본적으로 원하는대로 )와 hook_schema
다른 이름 을 지정한 다음 hook_install ()에서 먼저 데이터베이스를 전환 한 다음 사용자 정의 스키마 정의를 호출하는 것을 제외하고 drupal_install_schema () 가 수행하는 것을 복제 하십시오. 기능을 수행 한 다음 데이터베이스를 기본값으로 다시 전환하십시오.yourmodule_schema
yourmodule_schema_otherdb
또한 구현해야 hook_uninstall()
합니다.
그래도 왜 그렇게하고 싶을 지 모르겠다. :)
CREATE TABLE
진술을 작성하게 될 것이라고 생각 합니다.
나는 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();
}
@ Елин Й.에서 제공 한 * .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();
}
여기 요점이 있습니다.
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 접두사를 사용할 수 있습니다
$db_url
, $db_prefix
전역 설정으로는 드루팔 (6)을위한 것이며,하지 않을 때 (당신이 다른 서버를 액세스하는) 내 경우와 동일한 MySQL 서버의 다른 데이터베이스를 사용하는 경우 도트 표기법에만 작동합니다.
$db_url
에는 전역 $db_prefix
변수 가 없거나 글로벌 변수가 있으며, 존재하더라도 문제를 해결하지 못합니다.