2

DBに接続して使用すると、なぜ警告が表示されるのか疑問に思っています。ボーナスは、それを示さないクリーンなDBI_TRACE=1コードを書く方法を示しています。

!! warn: 0 CLEARED by call to connect methodコードは意図したとおりに機能するため、無害に見えることについて話しているのです。DBI トレース モードを設定しないと表示されないことに注意してください。

サンプル Perl コード (SQLite を使用):

use warnings;
use DBI;
DBI->connect("dbi:SQLite:dbname=test.sqlite","","") or die $DBI::errstr;

サンプル出力:

    DBI 1.612-ithread default trace level set to 0x0/1 (pid 12814 pi 1ddd010) at DBI.pm line 275 via test.pl line 2
    -> DBI->connect(dbi:SQLite:dbname=test.sqlite, , ****)
    -> DBI->install_driver(SQLite) for linux perl=5.010001 pid=12814 ruid=1000 euid=1000
       install_driver: DBD::SQLite version 1.29 loaded from /usr/lib/perl5/DBD/SQLite.pm
    <- install_driver= DBI::dr=HASH(0x204da38)
    !! warn: 0 CLEARED by call to connect method
    <- connect('dbname=test.sqlite', '', ...)= DBI::db=HASH(0x204e278) at DBI.pm line 662
    <- STORE('PrintError', 1)= 1 at DBI.pm line 714
    <- STORE('AutoCommit', 1)= 1 at DBI.pm line 714
    <- STORE('PrintWarn', 0)= 1 at DBI.pm line 717
    <- FETCH('PrintWarn')= '' at DBI.pm line 717
    <- STORE('Warn', 0)= 1 at DBI.pm line 717
    <- FETCH('Warn')= '' at DBI.pm line 717
    <- STORE('Username', '')= 1 at DBI.pm line 717
    <> FETCH('Username')= '' ('Username' from cache) at DBI.pm line 717
    <- connected('dbi:SQLite:dbname=test.sqlite', '', ...)= undef at DBI.pm line 723
    <- connect= DBI::db=HASH(0x204e278)
    <- STORE('dbi_connect_closure', CODE(0x204da08))= 1 at DBI.pm line 732
    <- DESTROY(DBI::db=HASH(204e1d0))= undef
    <- disconnect_all= '' at DBI.pm line 740
!   <- DESTROY(DBI::dr=HASH(204da38))= undef during global destruction
4

1 に答える 1

2

これは、DBI に含まれている次の XS コードから来ています。

if (!keep_error && meth_type != methtype_set_err) {
    SV *err_sv;
    if (trace_level && SvOK(err_sv=DBIc_ERR(imp_xxh))) {
        PerlIO *logfp = DBILOGFP;
        PerlIO_printf(logfp, "    !! %s: %s CLEARED by call to %s method\n",
            SvTRUE(err_sv) ? "ERROR" : strlen(SvPV_nolen(err_sv)) ? "warn" : "info",
            neatsvpv(DBIc_ERR(imp_xxh),0), meth_name);
    }
    DBIh_CLEAR_ERROR(imp_xxh);
} 
else {      /* we check for change in ErrCount during call */
    ErrCount = DBIc_ErrCount(imp_xxh);
}

これは単なる文字列「warn」のトレース ファイルへの出力であり、発行された警告ではありません。connect メソッドは SQLite が DBI の err を '0' に設定しているため、これは false ですが長さがゼロではないため、あなたのケースで発生していると思います。

ただし、複数の DBD (DBD::ODBC を含む) で発生することがわかります。

于 2013-09-24T14:34:06.463 に答える