[Dbix-class] DBIx::Class bug

Victor Igumnov victori at lamer0.com
Tue Nov 7 02:48:06 GMT 2006


     use strict;
     use Data::Dumper;
     package DB::IRCLogBot::Messages;
     use base qw/DBIx::Class/;
     __PACKAGE__->load_components(qw/PK::Auto ResultSetManager Core/);
     __PACKAGE__->table('messages');
     __PACKAGE__->add_columns(qw/id who body channel ircuser/);
     __PACKAGE__->set_primary_key('id');
     #__PACKAGE__->belongs_to('user' => 'DB::IRCLogBot::Users' ,  
'ircuser');
     # __PACKAGE__->belongs_to('channel' => 'DB::IRCLogBot::Channels' );
     package DB::IRCLogBot::Users;
     use base qw/DBIx::Class/;
     __PACKAGE__->load_components(qw/PK::Auto ResultSetManager Core/);
     __PACKAGE__->table('users');
     __PACKAGE__->add_columns(qw/id name/);
     __PACKAGE__->set_primary_key('id');
     __PACKAGE__->has_many('messages' => 'DB::IRCLogBot::Messages' ,
     'ircuser');
     package DB::IRCLogBot::Channels;
     use base qw/DBIx::Class/;
     __PACKAGE__->load_components(qw/PK::Auto ResultSetManager Core/);

- Ignored:
     __PACKAGE__->table('channels');
     __PACKAGE__->add_columns(qw/id name/);
     __PACKAGE__->set_primary_key('id');
     __PACKAGE__->has_many('messages' => 'DB::IRCLogBot::Messages' ,
     'channel');

     package DB::IRCLogBot;
     use base qw/DBIx::Class::Schema/;
     __PACKAGE__->register_class( 'Channels' =>  
'DB::IRCLogBot::Channels' );
     __PACKAGE__->register_class( 'Users'    =>  
'DB::IRCLogBot::Users' );
     __PACKAGE__->register_class( 'Messages' =>  
'DB::IRCLogBot::Messages' );

     package IRCLogBot;
     use base qw/Bot::BasicBot/;
     use DateTime;

     sub init {
          my $self = shift;

          $self->{db} =
            DB::IRCLogBot->connect(

      
'DBI:Pg:dbname=irclogbot;host=fab40;user=victori;password=cool123');
     }

     sub setup_insert_for_db {
          my $self    = shift;
          my $message = shift;

          my $dbchan =
            $self->{db}->resultset('Channels')->search( name =>  
$message->
     {channel} )
            ->first();

          $dbchan =
            $self->{db}->resultset('Channels')->new( { name =>  
$message->
     {channel} } )
            ->insert()
            unless defined $dbchan;

          my $dbuser =
            $self->{db}->resultset('Users')->search( name => $message->
     {who} )
            ->first();

          $dbuser =
            $self->{db}->resultset('Users')->new( { name => $message->
     {who} } )
            ->insert()
            unless defined $dbuser;

          return ( $dbchan, $dbuser );
     }

     sub said {
          my $self    = shift;
          my $message = shift;

          my $stamp = DateTime->now();
          my $dbmsg = $self->{db}->resultset('Messages')->new( {} );

          my ( $dbchan, $dbuser ) = $self->setup_insert_for_db 
($message);

          $dbmsg->who( $message->{who} );
          $dbmsg->body( $message->{body} );
          $dbmsg->ircuser($dbuser->id);
          $dbmsg->channel($dbchan->id);
          $dbmsg->insert();

          #$self->reply($message,"hello world!");
          return undef;
     }

     # with all known options
     my $bot = IRCLogBot->new(

          server   => "irc.freenode.net",
          port     => "6667",
          channels => ["#bottest"],

          nick      => "lamer0__",
          alt_nicks => [ "lamer0___", "lamer0_" ],
          username  => "lamer0",
          name      => "Yet Another lamer0",

          #ignore_list => [qw(dipsy dadadodo laotse)],
          charset => "utf-8",    # charset the bot assumes the  
channel is
     using

     );

     $bot->run();



     Code in question - I placed it all in a single file so its easy  
to read.

     DBIx::Class chokes on the belongs_to ---

     DBIx::Class::Relationship::BelongsTo::belongs_to(): Can't infer  
join
     condition for channel on DB::IRCLogBot::Messages; unable to load
     DB::IRCLogBot::Channels: Can't locate object method  
"primary_columns"
     via package "DB::IRCLogBot::Channels" at /opt/local/lib/perl5/
     site_perl/5.8.8/DBIx/Class/Relationship/BelongsTo.pm line 15.

     primary_columns? only way I can get it to work if I
     fully write out the channel/ircuser columns in my class like -

package DB::IRCLogBot::Messages;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/PK::Auto ResultSetManager Core/);
__PACKAGE__->table('messages');
__PACKAGE__->add_columns(
	"id","who","body",
	"channel",
     {
         data_type         => 'integer',
         default_value     => undef,
         is_nullable       => 0,
     },
	"ircuser",
     {
         data_type         => 'integer',
         default_value     => undef,
         is_nullable       => 0,
     },
	);
__PACKAGE__->set_primary_key('id');
__PACKAGE__->belongs_to('user' => 'DB::IRCLogBot::Users' , 'ircuser');
__PACKAGE__->belongs_to('channel' => 'DB::IRCLogBot::Channels',  
'channel' );



More information about the Dbix-class mailing list