liz has asked for the wisdom of the Perl Monks concerning the following question:

Is there an official way to obtain the driver name from a DBI database handle (object of type "DBI::db")?

Suppose I have a class method in an external module:

package External; sub dbh { $External::dbh ||= DBI->connect( 'DBI:mysql:test','root','' +) } #dbh

Now, after I obtain the database handle, I want to know which subclass of my own module I would need to bless an object with. Ideally:

package Foo; sub new { my $dbh = External->dbh; # how we get the $dbh is not the question + here my $driver = $dbh->SOMETHING; # now set to 'mysql', but what is "S +OMETHING" ? bless {},__PACKAGE__.'::'.$driver; } sub general { same for all database drivers }

and of course, I would then have a module Foo::mysql:

package Foo::mysql; @ISA = qw(Foo); sub specific { stuff specific to MySQL }

I can't find any easy way to do this, apart from possibly trying to do a query of some sort and inspect the class of the statement handle. If that would to be the way to do it, what would be an SQL statement that would work with all possible database drivers?


Thanks to 3dan and Abigail-II:

$dbh->{Driver}{Name}; # gives "mysql" $dbh->get_info( 17 ); # gives "MySQL"

The appropriate doc (which is indeed in DBI, but which I didn't find):

"Driver" (handle)
Holds the handle of the parent driver. The only recommended use for this is to find the name of the driver using:

"Name" (string)
Holds the "name" of the database. Usually (and recommended to be) the same as the ""dbi:DriverName:..."" string used to connect to the database, but with the leading ""dbi:DriverName:"" removed.