在过去的几个星期里,我们已经重新部署了服务器,并且随机地(但经常)得到以下错误。
dbix版本现在是0.082820,以前是0.08250,没有发生此错误。
“在解析方法时发现的”??“/home/perlbrew/.perlbrew/libs/perl-5.16.3@latest-20160209/lib/perl5/DBIx/Class/Row.pm第1250行”软件包"XXX“中的”重载“。
XXX包
可能有关联
use Class::Trait qw( TPrintable );
sub inflate_result {
my $self = shift;
my $ret = $self->next::method(@_);
my $typeCd = $ret->typeCd;
given ($typeCd) {
when( $specialTypeCd ) {
$self->ensure_class_loaded( $specialSubClass );
bless ($ret, $specialSubClass);
}
default {
bless ($ret, $self);
}
}
return $ret;
}引入XXX包的代码有一个助手方法,用于:
my $theY = $c->model('DB::Y')->find( $yID,
{
prefetch => [ { 'xxxs' => 'typecd' } , 'zid' ]
});
return $theY;关于问题所在的思考;如何使提交错误报告一致。
我们已经知道了SQLA_ISVALUE_IGNORE_AUTOGENERATED_STRINGIFICATION=1的Abstract.pm中潜在的解决方法。
发布于 2017-07-06 19:33:42
一个选择保持匿名的人建议的修正(这对我们perl 5.16.3来说是不够的)
最后,我们切换到perl 5.26,问题就解决了。(我们被告知“你不太可能: 5.18大修了很多过载的内部设备。”)
diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm
index 264b0b1..b4d8fb4 100644
--- a/lib/SQL/Abstract.pm
+++ b/lib/SQL/Abstract.pm
@@ -104,7 +104,11 @@ sub is_plain_value ($) {
# "%s"> and the source of overload::mycan())
#
# either has stringification which DBI SHOULD prefer out of the box
- grep { *{ (qq[${_}::(""]) }{CODE} } @{ $_[2] = mro::get_linear_isa( $_[1] ) }
+ grep {
+ *{ (qq[${_}::()]) }{CODE}
+ and
+ *{ (qq[${_}::(""]) }{CODE}
+ } @{ $_[2] = mro::get_linear_isa( $_[1] ) }
or
# has nummification or boolification, AND fallback is *not* disabled
(让你放心:下面是实际发生的事情:
perl -e '
use warnings;
use strict;
require Scalar::Util;
{
package Some::Overload;
use overload
q{""} => "named_stringifier",
fallback => 1,
;
sub named_stringifier { $_[0] . "" }
}
{
package Some::Subclass;
use base "Some::Overload";
}
my $thing = bless {}, "Some::Subclass";
{
no strict "refs";
grep { *{ (qq[${_}::(""]) }{CODE} } qw( Some::Subclass Some::Overload );
}
for (1, 2) {
# simulates runtime require of some *UNRELATED* class
eval sprintf <<EOS, $_;
{
package Some::UnrelatedThing%s;
use overload
q{""} => sub { \$_[0] . "" },
fallback => 1,
;
}
EOS
my $some_object = bless {}, "Some::Subclass";
}
warn "got here, all is well\n";
exit 0;
'https://stackoverflow.com/questions/44720560
复制相似问题