[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