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会话有可能不同。