2008-11-21 22 views
5

Me he conectado a una base de datos MySQL usando Perl DBI. Me gustaría saber a qué base de datos estoy conectado.¿Cómo puedo obtener el nombre de la base de datos de un manejador Perl MySQL DBI?

No creo que pueda usar:

$dbh->{Name} 

porque me llamo USE new_database y $dbh->{Name} sólo informa de la base de datos que inicialmente conectado.

¿Hay algún truco o necesito hacer un seguimiento del nombre de la base de datos?

+1

¿Cómo es posible que haya conectado a una base de datos sin saber qué base de datos que estaban conectadas a? Tienes que pasarlo a DBI para configurar la conexión ... –

+1

¿Quizás algún otro módulo hizo esto por él? ¿Quizás otros módulos decidan dinámicamente qué base de datos usar? Tal vez solo tiene curiosidad? – innaM

Respuesta

13

Trate simplemente ejecutar la consulta

select DATABASE(); 

Por lo Pude ver que el DBH tiene acceso al DSN con el que se conectó inicialmente, pero no después de que realizó el cambio. (Probablemente haya una forma mejor de cambiar las bases de datos).

+0

Sí, la consulta funciona: mi ($ nombre_bd) = $ dbh-> selectrow_array ("seleccionar BASE DE DATOS()"); – Harry

1

Puede pedir mysql:

($dbname) = (each %{$dbh->selectrow_hashref("show tables")}) =~ /^Tables_in_(.*)/; 

Actualización: obviamente, seleccione Base de datos() es una mejor manera de hacerlo :)

+0

Ahora que es un truco genial. – Harry

0

Cuando crea un objeto de conexión, es para una determinada base de datos. En el caso de DBI de todos modos. No creo que hacer el SQL USE database_name afecte su instancia de conexión. Tal vez haya una función select_db (Mi DBI está oxidada) para el objeto de conexión o tendrá que crear una nueva conexión a la nueva base de datos para que la instancia de conexión la informe correctamente.

0

FWIW - probablemente no mucho - DBD :: Informix realiza un seguimiento de la base de datos actual, que puede cambiar si se realizan operaciones como CREATE DATABASE. El atributo $dbh->{Name} se especifica mediante la especificación DBI como el nombre utilizado cuando se establece el identificador. En consecuencia, existe un atributo específico de Informix $dbh->{ix_DatabaseName} que proporciona el nombre actual de la base de datos actual. Ver: perldoc DBD::Informix.

Podría considerar solicitar al (a los) mantenedor (es) de DBD :: MySQL agregar un atributo similar.

1

$dbh->{Name} devuelve el nombre db de su manejador db.

Si se conectó a otro db después de conectarse con su dbh, usando la consulta mysql "USE db_name", y no configuró un nuevo identificador perl DBI db, por supuesto, $ dbh -> {Name} devolverá el primero con quien te habías conectado anteriormente ... No es generación espontaneica.

Así que para obtener el nombre db conectada una vez que el mango está configurado db - DBI para MySQL:

sub get_dbname { 
    my ($dbh) = @_; 
    my $connected_db = $dbh->{name}; 
    $connected_db =~ s/^dbname=([^;].*);host.*$/$1/; 
    return $connected_db; 
} 
+0

Creo que es posible que desee $ dbh -> {Name}, que es de lo que hablan los documentos de DBI en la sección "Atributos del control de la base de datos". Además, el DSN cambiará dependiendo del controlador e incluso de cómo el usuario invocó el método connect(). – jjohn

Cuestiones relacionadas