[Dbix-class] Maybe a Regression? Without a primary key, prefetches fail.

Peter Rabbitson rabbit+dbic at rabbit.us
Wed Mar 24 11:41:10 GMT 2010


J. Shirley wrote:
> I'm not sure if this counts as a regression, but it was for me :)
> 
> I have a class which is defined as:
> 
> package MyApp::Schema::StupidJoinTable;
> 
> use strict;
> use warnings;
> 
> use base 'DBIx::Class';
> 
> __PACKAGE__->load_components("Core");
> 
> __PACKAGE__->table("stupid_join_table");
> __PACKAGE__->add_columns(
>     "stupid_id",
>     {
>         data_type       => "integer",
>         default_value   => undef,
>         is_nullable     => 0,
>         size            => 11
>     },
>     "stupider_id",
>     {
>         data_type       => "integer",
>         default_value   => undef,
>         is_nullable     => 0,
>         size            => 11
>     },
> );
> 
> __PACKAGE__->belongs_to( 'thing_1', 'MyApp::Schema::Thing', 'stupid_id');
> __PACKAGE__->belongs_to( 'thing_2', 'MyApp::Schema::Thing2', 'stupider_id');
> 
> 1;
> 
> 
> Now, if I attempt to prefetch this relationship, I get this error
> thrown (from DBIx/Class/Row.pm, line 1138):
>       $class->throw_exception("Implicit prefetch (via select/columns)
> not supported with accessor 'multi'");
> 
> The reason is that without ->set_primary_key(...) in this result
> definition, the query on type is an empty array.
> 
> So, $prefetch->{$pre} is simply an empty array (the line "if (ref
> $prefetch->{$pre}[0] eq 'ARRAY')").
> 
> 
> This behavior is not changed if I explicitly define the columns on the
> relationships (eg., { 'foreign.stupid_id' => 'self.stupid_id' })
> 
> I'm still running 0.08115 in production, so it is working there, but
> this came up on my tests as a failure.  The fix for me is just adding
> in the primary keys as they should be, but it seemed like an odd
> behavior.
> 
> If it's a bug, I'm happy to at least commit a failing test case :)
> 

This will make the error more explicit:
http://dev.catalystframework.org/svnweb/bast/revision?rev=9044

In any case a failing test case is more than welcome, as the new code
has to be able to deal with such pk-less prefetches.



More information about the DBIx-Class mailing list