0

データベース スキーマ:

create table requests(
    rid integer primary key autoincrement,
    oid integer references orders (oid),
    command varchar(5),
    account varchar(50),
    txn_id varchar(12),
    md5 varchar(30),
    txn_date varchar(14),
    sum float,
    regdt timestamp default current_timestamp,
    constraint u1 unique (command,txn_id)
);
create table orders (
    oid integer primary key autoincrement,
    cid integer references customers (cid),
    pid integer references providers (pid),
    account varchar(50),
    amount float
);  

DBIx::Class::Schema::Loader によってコードにマップされます。

私のコントローラーコード:

 my $req= $schema->resultset('Request');
 my $order= $schema->resultset('Order');

      my $r= $req->find(
            {   command => 'check',
                txn_id  => $txn_id,
            },
            { key => 'command_txn_id_unique' }
        );
        my $oid=$r->oid;

        $req->create(
            {   command  => $command,
                account  => $account,
                txn_id   => $txn_id,
                md5      => $md5,
                txn_date => $txn_date,
                sum      => $sum,
                oid      => $oid
            }
        );
       my $o = $order->find($oid);

       $o->sum($sum);
       $o->update;

DBIC_TRACE=1 の tracert sqls

  SELECT me.rid, me.oid, me.command, me.account, me.txn_id, me.md5, me.txn_date, me.sum, me.regdt FROM requests me 
WHERE ( ( me.command = ? AND me.txn_id = ? ) ): 'check', '1358505665'
    SELECT me.oid, me.cid, me.pid, me.account, me.amount FROM orders me 
WHERE ( me.oid = ? ): '18'
    INSERT INTO requests ( account, command, md5, oid, sum, txn_date, txn_id) VALUES ( ?, ?, ?, ?, ?, ?, ? ): '1', 'pay', '44F4BC73D17E3FA906F658BB5916B7DC', '18', '500', '20130118104122', '1358505665'
    DBIx::Class::Storage::DBI::SQLite::_dbi_attrs_for_bind(): Non-integer value supplied for column 'me.oid' despite the integer datatype at /home/.../lib/TestPrj/Test.pm line 128
    SELECT me.oid, me.cid, me.pid, me.account, me.amount FROM orders me WHERE ( me.oid = ? ): 'TestPrj::Model::Result::Order=HASH(0x3dea448)'
    datatype mismatch: bind param (0) =HASH(0x3dea448) as integer at /usr/share/perl5/DBIx/Class/Storage/DBI.pm line 1765.

理解できない :

なぜ最初の選択クエリで $oid = 18 でOKなのですか。本当に18です。

しかし、2 番目の選択クエリでは、この $oid は HASH ? 私のコードのどこにも再定義されていません。

更新:

アドバイス @akawhy による Data::Dumper の使用 $oid が祝福された HASH であることがわかりました。

したがって、異なるコンテキストがあるように見えます

{ ... oid => $oid .. .} のスカラー

そしてfind(...)でハッシュします。

最初のケースでハッシュではない理由がわかりません。

しかし、 $oid=$r->get_column($oid) に変更すると、すべて正常に動作します。

4

2 に答える 2