【问题标题】:How to get the last error from MySQL in Perl如何在 Perl 中从 MySQL 获取最后一个错误
【发布时间】:2019-11-18 10:11:02
【问题描述】:

我在 Perl 中使用 DBI 来访问 MySQL。

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

我希望能够不使用 die 或 try。我希望能够执行 MySQL 命令,然后在下一次调用时检查错误类型。

这可能吗?

【问题讨论】:

  • 这是默认行为。您需要设置 RaiseError 以导致发生异常。强烈建议这样做,因为否则人们会像您一样编写代码而没有错误检查,没有它您必须检查每个调用,包括连接。
  • @Grinnz 这就是我想做的。但是“如何”检查错误?
  • 附带说明,如果这是新代码,请考虑DBD::MariaDB;它是一个分支,可以避免 DBD::mysql 中由于 backcompat 而无法修复的问题(尽管名称如此,但它同时支持 MySQL 和 MariaDB)

标签: mysql perl dbi


【解决方案1】:

正如 connect 所记录的那样:

"如果连接失败(见下文),它返回undef并设置$DBI::err和$DBI::errstr。(它没有显式设置$!。)你通常应该测试连接的返回状态如果失败则打印 $DBI::errstr。"

一旦有了句柄,就必须在每次数据库或语句句柄方法调用后检查err方法,errstr同样表示发生错误时的错误消息。

强烈建议,并且确实是包装器(例如 DBIx::ConnectorMojo::Pg)要求设置 RaiseError,以避免代码混乱和忘记检查错误的机会。

【讨论】:

  • 开启使用异常:DBI->connect('DBI:mysql:MyBase:localhost', 'user', 'pass', { RaiseError => 1, PrintError => 0, PrintWarn => 1 });PrintError => 0 这样做是为了让您不会收到重复的消息,还不如使用PrintWarn => 1 开启警告)。
  • 谢谢@Grinnz 这正是我想要的。正如我无法通过 Google 找到它一样,我似乎无法找到所有可能的 DBI 错误值的页面列表。如果您碰巧有一个方便的链接将不胜感激。
  • @DanielKaplan 这些值取决于每个驱动程序。您真正可以依赖的是,来自err 的真正返回意味着发生了错误并且errstr 包含该消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2021-05-29
  • 2014-06-29
  • 1970-01-01
  • 2014-02-18
相关资源
最近更新 更多