Drupal的数据库连接信息通过文件settings.php中的变量$databases设置。变量$databases是一个二维的数组,第一维称为key,第二维称为target。使用这种方式可以处理多数据库和主从分离这样复杂的情况。
例如,假设有这样的配置:
$databases['default']['default'] = array(
'database' => 'drupal',
);
$databases['default']['slave1'] = array(
'database' => 'slave1',
);
$databases['default']['slave2'] = array(
'database' => 'slave2',
); $databases['erp']['default'] = array(
'database' => 'erp',
); $databases['oa']['default'] = array(
'database' => 'oa',
);
默认的key是default,默认的target是default,因此大多数情况可以这样查询:
$result = db_query('SELECT * FROM node'); // drupal数据库
如果需要在指定的target中执行查询,可以这样:
$result = db_query('SELECT * FROM node', null, array('target' => 'slave1'));
$result = db_query('SELECT * FROM node', null, array('target' => 'slave2'));
如果需要在指定的key中执行查询,可以这样:
Database::setActiveConnection('erp');
$result = db_query('SELECT * FROM erp_user');
有多个从数据库时,也可以这样配置:
$databases['default']['slave'][] = array(
'database' => 'slave1',
);
$databases['default']['slave'][] = array(
'database' => 'slave2',
);
$databases['default']['slave'][] = array(
'database' => 'slave3',
);
如果需要在slave中执行查询,就这样写:
$result = db_query('SELECT * FROM node', null, array('target' => 'slave'));
Drupal遇到这种情况,会随机地从三台从数据库中选择一台。当然,在同一个PHP会话中这个连接是固定的,不同的PHP会话有可能不同。