Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple concurrent database connections in drupal 7

I'm writing a wrapper class for my drupal 7 site which lets me connect to and query my phpbb database.

When connecting to an external data source (as per drupal documentation) you have set the active db, run the query, then set the active db back to the default.

e.g.

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

But is there any way to use drupal's database wrapper to create a brand new connection which can be permanently set to the new database without having to do this switching back-and-forth nonsense? surely we can handle connections to multiple databases concurrently.

I have done some googling but haven't found anybody trying to do this as yet.

like image 572
thtas Avatar asked Jan 29 '11 19:01

thtas


2 Answers

Typical. 5 minutes after posting i figure it out... so, for future googlers:

Basically, you don't use db_query, instead you run the query on your connection without setting the active link.

you can figure this out by looking at how db_query works: http://api.drupal.org/api/drupal/includes--database--database.inc/function/db_query/7

So it looks like this:

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

This assumes you have a database configured in your settings.php like the following:

$databases['phpbb']['default'] = array(
    'driver' => 'mysql',
    'database' => 'forum',
    'username' => 'username',
    'password' => 'password',
    'host' => 'mysql.host.com',
    'prefix' => 'phpbb3_'
);
like image 184
thtas Avatar answered Oct 18 '22 17:10

thtas


Database::addConnectionInfo() perhaps?

This method allows the addition of new connection credentials at runtime. Under normal circumstances the preferred way to specify database credentials is via settings.php. However, this method allows them to be added at arbitrary times, such as during unit tests, when connecting to admin-defined third party databases, etc.

If the given key/target pair already exists, this method will be ignored.

like image 21
Fonant Avatar answered Oct 18 '22 17:10

Fonant