[Dbix-class] update_or_insert from hash reference

Matt S Trout dbix-class at trout.me.uk
Tue May 23 18:46:32 CEST 2006


Fernan Aguero wrote:
> Hi!
> 
> I'm new to DBIx::Class and after setting up a mysql database
> I'm trying to test DBIx::Class by defining a minimal
> object-relational mapping for a single table:
> 
> TABLE users (
>   user_id (PK, auto_increment),
>   username,
>   firstname,
>   lastname.
>   is_allowed_to_edit_database,
>   date_modified,
>   date_added )
> 	
> What I want to do to populate the DB is something like this:
> 
> my $userHashRef = {
>   username  => $username,
>   firstname => $firstname,
>   lastname  => $lastname,
>   ... ...
>   };
> 
> And then 
> 
> # get an object
> my $appUser = MyApp::DB::User->new( $userHashRef );
> 
> # update or insert
> $appUser->update_or_insert;
> 
> 
> However, I don't know if what I'm trying to do is possible
> ...  reading the pod for DBIx::Class::Row suggests to me
> that this can be done.  So I went ahead and did this:
> 
> package MyApp::DB::Users;
> 
> use base qw/DBIx::Class/;
> use DBIx::Class::Row;
> 
> __PACKAGE__->load_components( qw/Core/ );
> 
> # set the table name
> __PACKAGE__->table('users');
> 
> # set columns in the table
> __PACKAGE__->add_columns( qw/
>   user_id username password date_modified date_added firstname
>   lastname is_allowed_to_edit_database / );
>   
> # set the primary key
> __PACKAGE__->set_primary_key( qw/ user_id /);
> 
> 
> sub new {
>   my ( $class, $hashRef ) = @_; 
>   $class = ref( $class ) || $class; 
>   my $userObj = DBIx::Class::Row->new( $hashRef );  
>   bless( $userObj, $class );
>   return $userObj;
> }
>  
> and in my insertdb test script:
> use MyApp::DB::Users;
> my $userObj = MyApp::DB::Users->new( $userHashRef );
> $userObj->update_or_insert;
> 
> However, I'm getting the following error: 
> Can't locate object method "has_column" via package "DBIx::Class::Row" at /usr/local/lib/perl5/site_perl/5.8.8/DBIx/Class/Row.pm line 42.
> 
> What am I missing? What am I doing wrong? Thanks in advance,

Read the Manual - you've not loaded the components you need, your new() 
method is both unnecessary and broken, and there's no update_or_insert 
method - you want $rs->update_or_create ...



More information about the Dbix-class mailing list