2011-01-29 48 views
9

Estoy escribiendo una clase contenedora para mi sitio drupal 7 que me permite conectarme y consultar mi base de datos phpbb.Múltiples conexiones concurrentes de bases de datos en drupal 7

Cuando se conecta a una fuente de datos externa (según la documentación de drupal) ha establecido la base de datos activa, ejecuta la consulta, y luego establece el valor predeterminado de la base de datos activa.

p. Ej.

db_set_active('phpbb'); 
$result = db_query($sql,$args,$opts);        
db_set_active();//back to default 

Pero ¿hay alguna manera de utilizar envoltorio base de datos de Drupal para crear una conexión nueva marca que se puede establecer de forma permanente a la nueva base de datos sin tener que hacer esto conmutación de ida y vuelta sin sentido? seguramente podemos manejar conexiones a múltiples bases de datos al mismo tiempo.

He hecho algunas búsquedas en Google pero todavía no he encontrado a nadie que intente hacer esto.

Respuesta

12

Típico. 5 minutos después de publicarlo lo averiguo ... entonces, para los futuros usuarios de Google:

Básicamente, no usa db_query, en su lugar ejecuta la consulta en su conexión sin establecer el enlace activo.

se puede resolver esto por observar cómo funciona la db_query: http://api.drupal.org/api/drupal/includes--database--database.inc/function/db_query/7

Por lo que se ve así:

$target='default'; 
$key = 'phpbb'; 
$phpbb = Database::getConnection($target,$key); 
$result = $phpbb->query($sql,$args,$opts); 

Esto supone que tiene una base de datos configurada en su settings.php como la siguiente :

$databases['phpbb']['default'] = array(
    'driver' => 'mysql', 
    'database' => 'forum', 
    'username' => 'username', 
    'password' => 'password', 
    'host' => 'mysql.host.com', 
    'prefix' => 'phpbb3_' 
); 
+0

http://drupal.org/node/18429 también tiene algunos ejemplos de código, especialmente si desea configurar dinámicamente la configuración de la base de datos, es decir, no codificada en settings.php. Por ejemplo, si almacenó configuraciones de la base de datos en algún lugar que no sea en settings.php, puede crear dinámicamente la matriz y usar Database :: addConnectionInfo() para hacer la conexión de la base de datos. – sillygwailo

+6

'$ phpbb = Base de datos :: getConnection ($ target = 'default', key = 'phpbb');' este es un error que veo de vez en cuando y no sé cómo pueden las personas llegar a ese código . Lo que quería era '$ phpbb = Database :: getConnection ('default', 'phpbb');' la única razón por la que su código funcionaba era que la expresión '$ target = 'default'' evaluaba' default' pero la variable ' $ target' en el alcance * caller * cambia a ''default'' que probablemente no está indended. – chx

+0

@chx De acuerdo - Respuesta actualizada :) – thtas

1

Database::addConnectionInfo() quizás?

Este método permite la adición de nuevas credenciales de conexión en el tiempo de ejecución . En circunstancias normales, la forma preferida de especificar las credenciales de la base de datos es a través de settings.php. Sin embargo, este método permite ellos que se añaden a veces arbitrarias, como durante pruebas de unidad, cuando de conexión a bases de datos de terceros definidas por el administrador, etc.

Si el par de claves/diana dada ya existe, este método ser ignorado.

0

La definición de getConnection cita un orden diferente para los argumentos que los utilizados anteriormente.

function getConnection($target = 'default', $key = NULL) 

Esto es tristemente diferente de bases de datos :: addConnectionInfo() que es

public static function addConnectionInfo($key, $target, $info) 

Además, en DB_select, la clave $ no es un parámetro, aunque es en la matriz de opciones:

function db_select($table, $alias = NULL, array $options = array()) { 
    if (empty($options['target'])) { 
    $options['target'] = 'default'; 
    } 
    return Database::getConnection($options['target'])->select($table, $alias, $options); 
} 

mientras

final public static function getConnection($target = 'default', $key = NULL) { 

por lo que esto implica que el 'maestro' o 'esclavo' o 'predeterminado' siempre se utiliza como conjunto, pero no la clave de la base de datos alternativa/esquema, que requiere el db_set_active ('...'); y db_set_active(); alrededor del db_select.

Dado que las llamadas a otros dbs pueden ser fácilmente requeridas dentro del procesamiento del db_select (como las llamadas de desarrollo o las llamadas en alters), este es un diseño inflexible. El cambio de esta llamada:

return Database::getConnection($options['target'])->select($table, $alias, $options); 

para agregar el parámetro clave (que ya está spec'da como argumento !!) es necesaria pero insuficiente por lo que yo puedo ver ahora.

Cuestiones relacionadas