[SP-pm] DBIx::Class insert ignore

Wallace Reis reis.wallace at gmail.com
Wed Sep 16 06:20:43 PDT 2009


2009/9/16 jimmy <jimmy.tty em gmail.com>:
> On Wed, Sep 16, 2009 at 09:38:00AM -0300, Jorge Augusto Senger wrote:
>>    jimmy,
>>
>>    dá uma olhada no método find_or_create:
>>    http://search.cpan.org/~ribasushi/DBIx-Class-0.08111/lib/DBIx/Class/ResultSet.pm#find_or_create
> me corrija se estiver enganado para dessa forma ele irá executar um
> "select" antes de cada "insert" não é?

Sim, porém você usar o INSERT IGNORE não é correto, pois se
aconteceram erros, excessões são lançadas, assim você tem um problema
que precisa ser resolvido, ou evitando que os erros aconteçam ou
tratando-os.
Você poderia fazer uma consulta para retornar todos os registros já
existentes e usar isto para filtrar sua entrada, como:

my $rs = $schema->resultset('Foo')->search_rs({
    my_pk_field => { -in => [@keys_from_bulk_data_ref] }
});
$rs->result_class('DBIx::Class::ResultClass::HashRefInflator'); # para
pular o passo de criação de row objects e retornar hashrefs
while (my $row_hashref = $rs->next) {
    delete $bulk_data_ref->{$row_hashref->{my_pk_field}};
}
# insere os dados que restaram no $bulk_data_ref
...

-- 
     wallace reis/wreis         Catalyst and DBIx::Class consultancy with a clue
     Software Engineer		and a commit bit: http://shadowcat.co.uk/catalyst/
 Shadowcat Systems Limited
 http://www.shadowcat.co.uk     http://www.linkedin.com/in/wallacereis


More information about the SaoPaulo-pm mailing list