Как получить последнюю ошибку MySQL в Perl

Я использую DBI в Perl для доступа к MySQL.

return DBI->connect('DBI:mysql:MyBase:localhost', 'user', 'pass');
…
my $query = $connection->prepare($command);
my $result = $query->execute();
$query->finish;

Я бы не хотел использовать die or try. Я просто хотел бы иметь возможность выполнить команду MySQL, а затем при следующем вызове проверить типы ошибок.

Это возможно?


person Daniel Kaplan    schedule 08.07.2019    source источник
comment
Это поведение по умолчанию. Вам нужно установить RaiseError, чтобы возникли исключения. Это настоятельно рекомендуется, поскольку в противном случае люди будут писать код, как вы, без проверки ошибок, и без этого вы должны проверять каждый вызов, включая соединение.   -  person Grinnz    schedule 09.07.2019
comment
@Grinnz Это то, чем я хочу заниматься. Но как мне проверить на наличие ошибок?   -  person Daniel Kaplan    schedule 09.07.2019
comment
В качестве дополнительного примечания рассмотрите DBD :: MariaDB, если это новый код; это вилка, которая позволяет избежать проблем, которые невозможно исправить в DBD :: mysql из-за обратной совместимости (и поддерживает как MySQL, так и MariaDB, несмотря на название)   -  person Grinnz    schedule 09.07.2019


Ответы (1)


Как описано в документации для connect:

"Если соединение не удается (см. Ниже), он возвращает undef и устанавливает как $ DBI :: err, так и $ DBI :: errstr. (Он не устанавливает явно $ !.) Обычно вам следует проверить статус возврата соединения и напечатать $ DBI :: errstr, если это не удалось. "

Если у вас есть дескриптор, метод err необходимо проверять после каждого вызова метода дескриптора базы данных или оператора. , а errstr аналогичным образом представляет сообщение об ошибке в случае ошибки.

Это настоятельно рекомендуется и действительно требуется для таких оболочек, как DBIx :: Connector или Mojo :: Pg, чтобы установить RaiseError, чтобы избежать беспорядка в коде и вероятности того, что вы забудете проверить наличие ошибок.

person Grinnz    schedule 08.07.2019
comment
Чтобы включить использование исключений: DBI->connect('DBI:mysql:MyBase:localhost', 'user', 'pass', { RaiseError => 1, PrintError => 0, PrintWarn => 1 }); (PrintError => 0 делает это так, чтобы вы не получали повторяющиеся сообщения, а также может включать предупреждения с помощью PrintWarn => 1). - person ikegami; 09.07.2019
comment
Спасибо, @Grinnz, это именно то, что я искал. Так же, как я не мог найти это через Google, я не могу найти страницу со списком всех возможных значений DBI err. Буду очень признателен, если у вас есть ссылка под рукой. - person Daniel Kaplan; 09.07.2019
comment
@DanielKaplan Эти значения зависят от каждого драйвера. Все, на что вы действительно можете положиться, это то, что истинный возврат от err означает, что произошла ошибка, а errstr содержит сообщение. - person Grinnz; 09.07.2019