[Dbix-class] use overload causes error
Stephen Moore
sbmoore at arc.arizona.edu
Thu Apr 27 19:22:30 CEST 2006
Hello,
I've written a short script using DBIx::Class::Schema. It works about
like I would expect, until I added the following line in
GenesDB::SegmentTypes:
'use overload '""' => 'type', fallback => 1;'
(I found this in DBIx::Class::Manual::Cookbook.) When I run the script
with that line uncommented, I get the following error:
DBD::mysql::st execute failed: Duplicate entry '1' for key 1
at /usr/local/share/perl/5.8.7/DBIx/Class/Storage/DBI.pm line 516.
DBIx::Class::AccessorGroup::__ANON__(): Error executing 'INSERT INTO
segment_types (id) VALUES (?)': Duplicate entry '1' for key 1
at ./test.pl line 14
I'm not sure why it would be trying to insert a new record into
segment_types. Is there something I am doing wrong?
Below is the script that fails, along with the relevant classes.
Thanks,
Stephen
#!/usr/bin/perl
use warnings;
use strict;
use lib './';
use GenesDB;
my $schema = GenesDB->connect('dbi:mysql:database', 'username',
'password', {});
my $locus = $schema->resultset('GenesDB::Loci')->find(1);
print 'Ref: ', $locus->ref, "\n";
print 'Segment Type: ', $locus->segment_type_id, "\n";
package GenesDB::SegmentTypes;
use strict;
use warnings;
use base 'DBIx::Class';
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('segment_types');
__PACKAGE__->add_columns(qw/id type/);
__PACKAGE__->set_primary_key('id');
use overload '""' => 'type', fallback => 1;
__PACKAGE__->has_many(loci => 'Loci', 'segment_type_id');
1;
package GenesDB::Loci;
use strict;
use warnings;
use base 'DBIx::Class';
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('loci');
__PACKAGE__->add_columns(qw/id ref segment_type_id /);
__PACKAGE__->set_primary_key('id');
__PACKAGE__->belongs_to(segment_type_id => 'GenesDB::SegmentTypes');
1;
package GenesDB;
use base qw/DBIx::Class::Schema/;
__PACKAGE__->load_classes();
1;
And the sql used to create the tables:
use genes_test;
SET FOREIGN_KEY_CHECKS=0;
#----------------------------
# Table structure for loci
#----------------------------
CREATE TABLE `loci` (
`id` int(11) NOT NULL auto_increment COMMENT 'Old SNPid',
`ref` varchar(25) NOT NULL COMMENT 'reference point used to specify
location',
`segment_type_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `segment_type_id` (`segment_type_id`),
CONSTRAINT `loci_ibfk_3` FOREIGN KEY (`segment_type_id`) REFERENCES
`segment_types` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
set names latin1;
#----------------------------
# Records for table loci
#----------------------------
insert into loci values
(1, 'ORF-2576', 1);
#----------------------------
# Table structure for segment_types
#----------------------------
CREATE TABLE `segment_types` (
`id` int(11) NOT NULL auto_increment,
`type` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
set names latin1;
#----------------------------
# Records for table segment_types
#----------------------------
insert into segment_types values
(1, ''),
(2, 'Exon'),
(3, 'Intron'),
(4, 'Intergenic'),
(5, '3\' Intergenic');
More information about the Dbix-class
mailing list