Как я могу получить имя базы данных из дескриптора Perl MySQL DBI?

Я подключился к базе данных MySQL с помощью Perl DBI. Я хотел бы узнать, к какой базе данных я подключен.

Я не думаю, что могу использовать:

$dbh->{Name}

потому что я вызываю USE new_database и $dbh->{Name} сообщает только базу данных, которую я изначально подключен к.

Есть ли какой-то трюк или мне нужно отслеживать имя базы данных?


person Harry    schedule 21.11.2008    source источник
comment
Как получилось, что вы подключились к базе данных, не зная, к какой базе данных вы подключаетесь? Вы должны передать его в DBI для настройки соединения...   -  person Brian C. Lane    schedule 21.11.2008
comment
Возможно, за него это сделал какой-то другой модуль? Возможно, что другие модули динамически решают, какую базу данных использовать? Может, ему просто интересно?   -  person innaM    schedule 21.11.2008


Ответы (5)


Попробуйте просто выполнить запрос

select DATABASE();

Из того, что я смог найти, у DBH есть доступ к DSN, к которому вы изначально подключились, но не после внесения изменений. (Вероятно, есть лучший способ переключения баз данных.)

person Rizwan Kassim    schedule 21.11.2008
comment
Да, запрос работает: my ($dbname) = $dbh->selectrow_array(select DATABASE()); - person Harry; 21.11.2008

$dbh->{Name} возвращает имя базы данных из вашего дескриптора базы данных.

Если вы подключились к другому db после подключения к вашему dbh, используя запрос mysql «USE db_name», и вы не настроили новый дескриптор perl DBI db, конечно, $dbh->{Name} вернет первый, к которому вы ранее подключались ... Это не стихийное зарождение.

Итак, чтобы получить имя подключенной базы данных после настройки дескриптора базы данных - для DBI mysql:

sub get_dbname {  
    my ($dbh) = @_;  
    my $connected_db = $dbh->{name};  
    $connected_db =~ s/^dbname=([^;].*);host.*$/$1/;  
    return $connected_db;  
}  
person hornetbzz    schedule 08.01.2011
comment
Я думаю, вам может понадобиться $dbh->{Name}, о чем говорится в документах DBI в разделе «Атрибуты дескриптора базы данных». Кроме того, DSN будет меняться в зависимости от драйвера и даже от того, как пользователь вызвал метод connect(). - person jjohn; 21.09.2016

Вы можете спросить mysql:

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

Обновление: очевидно, лучше выбрать DATABASE() :)

person ysth    schedule 21.11.2008

Когда вы создаете объект подключения, он предназначен для определенной базы данных. Во всяком случае, в случае с DBI. Я не верю, что выполнение SQL USE database_name вообще повлияет на ваш экземпляр соединения. Возможно, есть функция select_db (My DBI ржавая) для объекта соединения, или вам придется создать новое соединение с новой базой данных, чтобы экземпляр соединения правильно сообщил об этом.

person Chris Kloberdanz    schedule 21.11.2008

FWIW - вероятно, немного - DBD::Informix отслеживает текущую базу данных, которая может измениться, если вы выполняете такие операции, как CREATE DATABASE. Атрибут $dbh->{Name} указан в спецификации DBI как имя, используемое при установке дескриптора. Следовательно, существует специфический для Informix атрибут $dbh->{ix_DatabaseName}, который предоставляет фактическое имя текущей базы данных. См.: perldoc DBD::Informix.

Вы можете попросить мейнтейнера(ов) DBD::MySQL добавить аналогичный атрибут.

person Jonathan Leffler    schedule 21.11.2008