[Dbix-class] Problem with populate() and commits?

Peter Rabbitson rabbit+dbic at rabbit.us
Mon May 18 14:34:09 GMT 2009


Chris Cole wrote:
> Peter Rabbitson wrote:
>> Chris Cole wrote:
>>>   my $new_album = $schema->resultset('Album')->create({
>>>     title  => 'Wish You Were Here',
>>>     artist => 'Pink Floyd'
>>>   });
>>>
>>> Now you can add data to the new record:
>>>
>>>   $new_album->label('Capitol');
>>>   $new_album->year('1975');
>>>   $new_album->update;"
>>>
>>> Isn't $new_album a resultset too?
>> No, $new_album is an actual row object, something that has columns set
>> to _specific_ values, something that represents a row, not a bunch of
>> rows under a SELECT. Suggest a better wording to make this clearer.
> 
> Indeed. As a novice to this class (but not perl) this is /far/ from clear.

So where is the doc patch to make it clearer?

>>>> I am not sure which part is it that you find contradicting. Please point
>>>> out actual snippets, or even better - provide documentation patches :)
>>> See above. To me, that code snippet implies transactions, but there's no
>>> mention anywhere AFAICS in the Intro or Cookbook PODs regarding the
>>> preferred/assumed use of autocommit and transactions. It's buried in the
>>> link that Peter Rabbitson mentioned.
>>>
>> I am still confused sorry... but really trying to understand. What makes
>> you believe that the above example _implies_ transactions?
>>
> 
> The '$new_album->update' bit. To me at least, it implies that the
> additions are not made immediately, but only after the update() command
> is sent.
> 
> Also the preceding section [1] of the POD also has:
> "Just like with Class::DBI, you call update to commit your changes to
> the database:
> 
>   $album->update;
> 
> If needed, you can throw away your local changes:
> 
>   $album->discard_changes if $album->is_changed;
> 
> As you can see, is_changed allows you to check if there are local
> changes to your object."
> 
> So, in the context of the page 'update' is clearly implicated with
> transactions. To the unknowing eye there's no obvious difference between
> the two 'update' commands.
> 

my $row = $resultset->new_result (\%values);
$row->insert

is the same as

my $row $resultset->create (\%values)



$row->col_a ('stuff');
$row->set_column (col_b => 'stiff')
$row->update

is the same as

$row->update ({ col_a => 'stuff', col_b => 'stiff' });


Now this is the extent of help I am giving for free. For more you will
need to pay back with doc patches :)

In general remember that DBIC _never_ assumes transactions on your behalf,
except for internal racy code. Transaction handling is your responsibility.

Cheers



More information about the DBIx-Class mailing list