недостатки ORM

Модератор: Модераторы разделов

Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

недостатки ORM

Сообщение gcc »

надоело использовать SQL, при построение запроса нужно всегда строить в зависимости от каких-то критериев массивами

нашел DBIx::Class, если ли недостатки у ORM? мне сначала не понравилось ORM....

вот пример, плохо выглядит

Код: Выделить всё

if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
$sql = join ('', @sql);
        my $sth = $self->{dbh}->prepare(
            "SELECT t1.username,
                                t1.name,
                                t1.quota,
                                t1.domain
                         FROM mailbox AS t1,
                              domain AS t2
                         WHERE t1.domain = ?
                         AND t1.username = ?
                         $sql
                         AND t1.domain = t2.domain
                         LIMIT 1
                          "
        );
        $sth->execute(@sqlp);


Код:

if ($ps->{type_content_privat} eq 'on') { $ps->{type_content_privat} = '1'; } else { $ps->{type_content_privat} = '0'; } my $section; if ($ps->{type_content_privat} eq 'on') { $ps->{type_content_privat} = '1'; $ps->{section_child} = $c->user->{user}->{id}; } else { if (defined ($ps->{section_child})) { my $dbh = $c->model('DBI')->dbh; my $sth = $dbh->prepare("SELECT id_se FROM section WHERE id_se = ? LIMIT 1"); $sth->execute($ps->{section_child}); $section = $sth->fetchrow_hashref(); $sth->finish(); $type_section_privat = 0; } } my $error_se; unless ($ps->{name_content} || $ps->{name_hiden_content} || $ps->{content_keys} || $ps->{content_text} ) { $error_se = 1; } # If the username and password values were found in form if ($error_se != 1 && $section->{id_se}) { # exit; # $c->stash->{error_msg} = "Bad username or password2."; # $c->forward('add_section'); # return; my $sql; my @sql; if ( $ps->{submit} && $ps->{submit} eq 'Add content' ) { $sql = ' INSERT INTO content ( id_un, id_se, name_co, heading_name_co, keys_co, text_co, active_co, hiden_co, hiden_g_co, close_co, voting_co, vo_all_co, vo_balls_co, vo_per, created ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) '; push @sql, $c->user->{user}->{id}, $ps->{section_child}, $ps->{name_content}, $ps->{name_hiden_content}, $ps->{content_keys}, $ps->{content_text}, '0', $ps->{type_hiden_content}, '0', '0', $ps->{type_voting_content}, '1', '1', '1', time; } if ( $ps->{submit} && $ps->{submit} eq 'Edit content' ) { my $sql = 'UPDATE content SET id_se = ?, name_co = ?, heading_name_co, keys_co, text_co, active_co, hiden_co, hiden_g_co, close_co, voting_co, vo_all_co, vo_balls_co, WHERE id = ? " ); push @sql, $self->{p}->{fPassword}, $self->{p}->{fCreateddomain}, $self->{p}->{id}->{id} ); }


вот так красивей:

Код:

package AddressBook::Controller::Address; use strict; use warnings; use base qw(Catalyst::Controller::FormBuilder Catalyst::Controller:: BindLex'); sub add : Local Form('/address/edit') { my ($self, $c, $person_id) = @_; $c->stash->{template} = 'address/edit.tt2'; $c->forward('edit', [undef, $person_id]); } sub edit : Local Form { my ($self, $c, $address_id, $person_id) = @_; my $address : Stashed; if(!$address_id && $person_id){ # we're adding a new address to $person # check that person exists my $person = $c->model('AddressDB::People')-> find({id => $person_id}); if(!$person){ $c->stash->{error} = 'No such person!'; $c->detach('/person/list'); } # create the new address $address = $c->model('AddressDB::Addresses')-> new({person => $person}); } else { $address = $c->model('AddressDB::Addresses')-> find({id => $address_id}); if(!$address){ $c->stash->{error} = 'No such address!'; $c->detach('/person/list'); } } if ($c->form->submitted && $c->form->validate){ # transfer data from form to database $address->location($c->form->field('location')); $address->postal ($c->form->field('postal' )); $address->phone ($c->form->field('phone' )); $address->email ($c->form->field('email' )); $address->insert_or_update; $c->stash->{message} = ($address_id > 0 ? 'Updated ' : 'Added new '). 'address for '. $address->person->name; $c->detach('/person/list'); } else { # transfer data from database to form if(!$address_id){ $c->stash->{message} = 'Adding a new address '; } else { $c->stash->{message} = 'Updating an address '; } $c->stash->{message} .= ' for '. $address->person->name; $c->form->field(name => 'location', value => $address->location); $c->form->field(name => 'postal', value => $address->postal); $c->form->field(name => 'phone', value => $address->phone); $c->form->field(name => 'email', value => $address->email); } } sub delete : Local { my ($self, $c, $address_id) = @_; my $address = $c->model('AddressDB::Addresses')-> find({id => $address_id}); if($address){ # "Deleted First Last's Home address" $c->stash->{message} = 'Deleted ' . $address->person->name. q{'s }. $address->location. ' address'; $address->delete; } else { $c->stash->{error} = 'No such address'; } $c->forward('/person/list'); } 1;


короче, как правильно работать c DBI, когда много гемороя?
есть ли недостатки у ORM?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: недостатки ORM

Сообщение Portnov »

ORM, как правило, расчитаны на какой-нибудь круг задач. Конкретно про упомянутое вами ничего сказать не могу, но например django orm не эффективно работает с aggregate-функциями (многое вообще не отображено, для других функций создаются неэффективные запросы). У другого orm будут другие "белые пятна".
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: недостатки ORM

Сообщение gcc »

там возможно еще "плюс", если будет работать кэширование, наверное не обязательно делать один запрос из всех...

ORM если вы в ООП стиле пытаетесь сделать допустим 10-15 запросов, то ORM обработав их сделает 2-4 SQL запросов
(возможно они буду тне качественные, но MyISA таблицы они, типо, скоросные, и там через JOIN строит)

вместо того чтобы писать вот такое:
(по-моиму это не красиво и плохо читается, если сделать свой класс, то там ничего нового не знаю что написать чтобы был рефакторинг по лучше)

Код: Выделить всё

if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'

if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}

} elsif () {
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'

if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
} else {
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
}

}
if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'bla'
}
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: недостатки ORM

Сообщение gcc »

что использовать: RDBO или DBIC?

Rose::DBx или DBIx::Class?

кто-то использовал это?

я пока не нашел нормальную документацию по Rose::DBx, DBIx::Class более понятный...
Спасибо сказали: