数据库架构:
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;
我的tracert sqls,DBIC_TRACE = 1
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并且确定。真的是18岁。
但是在第二个选择查询中这个$ oid是一个HASH?它没有在我的代码中的任何地方重新定义。
UPD:
通过建议使用Data :: Dumper @akawhy我看到$ oid是一个幸运的HASH。
所以,看起来有不同的背景
并在find(...)中哈希。
我不知道为什么在第一种情况下它不是哈希。
但是,当我改为$ oid = $ r-> get_column($ oid)时,一切正常。
答案 0 :(得分:2)
$ resultset-> find返回一个Result对象。 你没有粘贴你的ResultSource类,但是当你写下你使用Schema :: Loader生成它们时,我假设了' oid'列访问器方法与' oid'相同。关系访问者。在这种情况下,它会根据标量与列表上下文返回不同的内容。
我建议重命名您的关系,以便为列值及其关系提供两个不同的访问者。
我在所有关系前加上' rel _'但您可能更喜欢不同的命名标准。
答案 1 :(得分:1)
我认为my $oid=$r->oid;
$oid
是一个参考。您可以使用ref
或Data::Dumper
查看其类型。
也许你应该使用$oid->oid
并注意此错误
DBIx::Class::Storage::DBI::SQLite::_dbi_attrs_for_bind(): Non-......