[Dbix-class] Insert using a result set with 'where' produces weird result

Ivan Fomichev ifomichev at gmail.com
Mon Jul 30 10:40:00 GMT 2007


Hello,

I've got a weird result when trying to insert a row using a result set
with 'where'.
Here's a sample code:

8<--------------------------ifomichev_test.sql-----------------------------
DROP TABLE IF EXISTS `records`;
CREATE TABLE `records` (
  `record_id` int(10) unsigned NOT NULL auto_increment,
  `value` varchar(255) default NULL,
  PRIMARY KEY  (`record_id`)
);

INSERT INTO `records` VALUES (1,'baba'),(2,'dada'),(3,'kaka'),(4,NULL);
8<-------------------------------Schema.pm---------------------------------
package Schema;

use base qw/DBIx::Class::Schema/;

__PACKAGE__->load_classes();

1;
8<---------------------------Schema/Record.pm------------------------------
package Schema::Record;

use base qw/DBIx::Class/;

__PACKAGE__->load_components( qw/ Core PK::Auto / );
__PACKAGE__->table( 'records' );
__PACKAGE__->add_columns( qw/ record_id value / );
__PACKAGE__->set_primary_key( qw/ record_id / );

1;
8<-----------------------------test_dbic.pl--------------------------------
#!/usr/bin/perl
use strict;
use warnings;

use Schema;

my $schema = Schema->connect( 'DBI:mysql:ifomichev_test', 'root' );
$schema->storage()->debug( 1 );

my $rs = $schema->resultset('Record')->search(
    { value => { '!=' => undef } },
);

$rs->create( { value => 'papa' } );
#$rs->result_source()->resultset()->create( { value => 'papa' } );
8<----------------------------------END------------------------------------

Result:

8<----------------------------CURRENT RESULT-------------------------------
INSERT INTO records (value) VALUES (?): 'HASH(0xa3d50cc)'
8<----------------------------------END------------------------------------

'HASH(0xa3d50cc)' appears because a new result is being created with
'value' equal to a structure passed to search method ( { '!=' => undef
} ), though I would expect 'value' be overriden with what I passed to
the create method (i. e., 'papa'). I worked this around with taking a
result source from the result set and then making a new result set
(see a commented line above):

8<----------------------------EXPECTED RESULT------------------------------
INSERT INTO records (value) VALUES (?): 'papa'
8<----------------------------------END------------------------------------

Regards,
Ivan



More information about the Dbix-class mailing list