[Moscow.pm] Rose::DB update

Peter Vereshagin peter на vereshagin.org
Чт Апр 5 10:32:22 PDT 2012


Hello.

> From: Павел <pavel на kuptsov.info>
> To: moscow-pm на pm.org
> Subject: [Moscow.pm] Rose::DB update
> Message-ID: <op.wb8p8j15yxtwe9 на g--001.giftec.ru>
> Content-Type: text/plain; charset=koi8-r; format=flowed; delsp=yes
> 
> Здравствуйте,
> Нигде не могу найти пример update для Rose::DB,
> который бы работал не так:


это 2 разныхз действия перед сохранением: 

> my $page = Rugosa::MjPage->new(id_pages => $id_pages)->load;

это load 

>            $page->id_lang($id_lang);
>            $page->id_cat($id_cat);
> ....
> $page->id_nomer_100($var);

который после этих сеттеров выльется в sql update

> а как-то так:
> 
> $page = Rugosa::MjPage->new(id_lang =>$id_lang,
>                                        id_cat => $id_cat,
>                                        name_pages => $name_pages,
> 					........
>                                        id_nomer_100 => $var
>                                        );

а это --- конструктор, который кроме sql insert на сохранении ничего не выдаст

> если я передаю в new существующий id - при сохраниении пишет:
> DBD::mysql::st execute failed: Duplicate entry '19' for key 'PRIMARY' at

и т. о., чтобы сохранению быть в этом случае не sql insert а sql update, нужно
сначала проверить, не дупловат ли первичный ключ. Инлгда это умеет субд,
например, в mysql есть кляуза 'on exists update' для insert.

Однако, даже и в таком случае сильно не уверен, что делвть из new и потом save
не sql insert а sql update в некоторых случаях это хорошая идея для реализации
в orm. Бо одно дело сеттеры после load --- они меняют запись после sql select,
а другое дело аргументы new --- там поля в записи ещё не проиничены.

> а для каждого поля писать :
> $ob->field1($var);
> как-то не правильно мне кажется.
> Подскажите правильный вариант?

update_sometable(), конечно, вариант, но можно писать не для каждого поля через:

    my @update_pairs = ( 'field0' => \$var0, 'field1' => \$var1 );
    while (@update_pairs) {
        my ( $field => $var ) = map { shift @update_pairs } 0 .. 1; 
        $page->$field( $$var );
    }

--
Peter Vereshagin <peter на vereshagin.org> (http://vereshagin.org) pgp: A0E26627 


Подробная информация о списке рассылки Moscow-pm