[Cascavel-pm] DBIx::Class Inserção em tabelas relacionadas

Márcio Vitor cromo.jml em gmail.com
Quinta Abril 16 07:03:36 PDT 2009


Nélio,

As tabelas estão criadas no banco com o Cascade?

Não sei como o Dbix Class lida com isto, mas de repente o mysql já inseriu e
o dbix-class tá tentando inserir novamente.

Márcio Vitor

2009/4/16 Nélio Nunes <nelio.nunes em sapo.pt>

> Caros,
>
> Ando aqui com um problema bicudo em que os ninjas do DBIx::Class poderão me
> ajudar, espero:
>
> Tenho 2 tabelas, uma principal, outra secundaria, com uma relação one to
> many de uma para a outra.
>
> a tabela principal é qq coisa deste género: (output do show create)
>
> CREATE TABLE `Servicos` (
>  `id` int(11) NOT NULL,
>  `semaforo` varchar(255) NOT NULL,
>   (...)
>  PRIMARY KEY  (`id`)
> ) ENGINE=InnoDB DEFAULT CHARSET=utf8
>
> a tabela secundária é isto:
>
> CREATE TABLE `Links_relacionados` (
>  `id` int(11) NOT NULL,
>  `nome` varchar(255) NOT NULL,
>  `url` varchar(255) NOT NULL,
>  `id_servico` int(11) NOT NULL,
>  PRIMARY KEY  (`id`),
>  KEY `id_servico` (`id_servico`),
>  CONSTRAINT `servicos_fk` FOREIGN KEY (`id_servico`) REFERENCES `Servicos`
> (`id`) ON DELETE CASCADE ON UPDATE CASCADE
> ) ENGINE=InnoDB DEFAULT CHARSET=utf8
>
>
> nas classes DBIx relativas ás duas tabelas, tenho o seguinte:
>
> package SAPO::Servicos;
> (...)
> __PACKAGE__->set_primary_key("id");
> __PACKAGE__->has_many(
>  "links_relacionado",
>  "SAPO::LinksRelacionados",
>  { "foreign.id_servico" => "self.id" },
> );
>
>
> package SAPO::LinksRelacionados;
> (...)
> __PACKAGE__->set_primary_key("id");
> __PACKAGE__->belongs_to("id_servico", "SAPO::Servicos", { id =>
> "id_servico" });
>
> Agora, quando é que isto estoura:
>
> Quando se tenta fazer um create_or_update com a seguinte estrutura:
>
> my $servicox = {
>    id                  => "6969",
>    semaforo            => "zemaria",
>    logotipo_servico    => "logotipo.gif",
>    link_servico        => "http://um_link_qq",
>    url_feed_rss        => "http://um_rss_qq",
>    title               => "da-lhe duro",
>    semaforo_destacado  => 1,
>    destacar_no_servico => 1,
>    links_relacionado   => [
>        { id => '293874', nome => "ola maria", url => "http://um_url_qq" },
>        { id => '293875', nome => "ola maria", url => "http://um_url_qq" }
>    ],
>
> };
>
> $schema->resultset('Servicos')->update_or_create($servicox, {id =>
> "6969"});
>
> Na primeira inserção, tudo corre bem, quando se tenta alterar alguma coisa
> e executar novamente, dá um erro de DBI:
>
> DBIx::Class::ResultSet::update_or_create(): DBI Exception: DBD::mysql::st
> execute failed: Duplicate entry '293874' for key 1 [for Statement "INSERT
> INTO Links_relacionados ( id, id_servico, nome, url) VALUES ( ?, ?, ?, ? )"
> with ParamValues: 0='293874', 1='6969', 2='ola maria', 3='http://um_url_qq
> ']
>
> O comportamento do update_or_create não se deveria estar a propagar pelas
> tabelas relacionadas?
>
> Alguém tem ideia do que é que pode estar a acontecer aqui?
>
>
> []'s
>
> Nélio
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20090416/862d6bc4/attachment.html>


Mais detalhes sobre a lista de discussão Cascavel-pm