[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