NAME

ORM - Object relational mapper äëÿ Perl, ïðåäíàçíà÷åí äëÿ õðàíåíèÿ è ïîèñêà îáúåêòîâ â áàçå äàííûõ.

SYNOPSIS

use Music::Song;
use Music::Performer;

# Show number of songs performed by 'Gorillaz'
print Music::Song->count( filter=>( Music::Song->M->performer->name eq 'Gorillaz' ) );

# Find object corresponding to performer 'Gorillaz'
$performer = Music::Performer->find
(
    filter=>( Music::Performer->M->name eq 'Gorillaz' ),
);

# Add new song to our database
$error = ORM::Error->new;
$song  = Music::Song->new
(
    error => $error,
    prop  =>
    {
        performer => $performer,
        year      => 2005,
        title     => "September's Gone",
        content   => "/home/user/music/Gorillaz/September's Gone.mp3",
    },
);
if( $error->fatal )
{
    die $error->text;
}
else
{
    print $song->title,"\n";
}

DESCRIPTION

ORM is Perl library that implements object-relational mapping. Its features are much similar to those of Java's Hibernate library, but interface is much different and easier to use.

Ïðåèìóùåñòâà èñïîëüçîâàíèÿ ORM

  • Ñ ïîìîùüþ ORM Âû ïîëó÷àåòå äîñòóï êî âñåì âîçìîæíîñòÿì SQL-ñåðâåðà áåç èñïîëüçîâàíèÿ SQL-çàïðîñîâ. SQL-çàïðîñû ãåíåðèðóþòñÿ ñ ó÷åòîì îñîáåííîñòåé êîíêðåòíîé ÑÓÁÄ. Ýòî ïîçâîëÿåò Âàì áûòü óâåðåííûìè ÷òî Âàøè ïðèëîæåíèÿ, íàïèñàííûå ñ èñïîëüçîâàíèåì ORM äåéñòâèòåëüíî ðàáîòîñïîñîáíû íà âñåõ ïîääåðæèâàåìûõ áàçàõ äàííûõ.

  • Áëÿãîäàðÿ òîìó, ÷òî Âàì íå ïðèäåòñÿ ïèñàòü SQL-çàïðîñû, ðåçêî óìåíüøàåòñÿ îïàñíîñòü âçëîìà Âàøåé èíôîðìàöèîííîé ñèñòåìû ñ èñïîëüçîâàíèåì àòàê òèïà SQL-injection.

  • Âû ëåãêî ìîæåòå ðåàëèçîâàòü áàëàíñèðîâêó íàãðóçêè è ïîâûñèòü îòêàçîóñòîé÷èâîñòü Âàøåé èíôîðìàöèîííîé ñèñòåìû èñïîëüçóÿ êîìáèíàöèþ äðàéâåðîâ ORM::Db::Replicated è ORM::Db::Backup è ðåïëèöèðóåìûå (íàïðèìåð, PostgreSQL) èëè êëàñòåðíûå (íàïðèìåð, MySQL Cluster) ÑÓÁÄ.

Îñíîâíûå âîçìîæíîñòè

  • Ïîääåðæêà íàñëåäîâàíèÿ õðàíèìûõ îáúåêòîâ

  • Ïîääåðæêà òðàíçàêöèé

  • Îòñóòñòâèå íåîáõîäèìîñòè ïèñàòü SQL-çàïðîñû

  • Ïîëíîöåííûé ïîèñê îáúåêòîâ â ÁÄ ñ èñïîëüçîâàíèåì îáû÷íûõ Perl-âûðàæåíèé

  • Ñâÿçè ìåæäó îáúåêòàìè "Îäèí êî ìíîãèì" è "Ìíîãèå êî ìíîãèì"

  • Ýìóëÿöèÿ âíåøíèõ êëþ÷åé

  • Èñòîðèÿ èçìåíåíèé îáúåêòîâ

  • ×àñòè÷íî çàãðóæåííûå (lazy-loaded) îáúåêòû

  • Ñòàòèñòè÷åñêèå äàííûå ïî îáúåêòàì (ñ èñïîëüçîâàíèåì GROUP BY)

  • Èñïîëüçîâàíèå îáúåêòîâ ïðîèçâîëüíûõ êëàññîâ â êà÷åñòâå ñâîéñòâ

  • Àâòîìàòè÷åñêèå àêåññîðû è ìóòàòîðû

  • Êåøèðîâàíèå îáúåêòîâ

  • Âûäåëåíûé ñëîé êîäà äëÿ ðàáîòû ñ ÁÄ

Èíôîðìàöèÿ î äîáàâëåíèè íîâûõ âîçìîæíîñòåé â ôàéëå TODO.txt

Îñíîâíûå òåðìèíû

Ïðîìåæóòî÷íûé (Intermediate) êëàññ

ýòî êëàññ êîòîðûé íå ìîæåò èìåòü ïðåäñòàâèòåëåé.

Èíèöèèðóþùèé (Initial) êëàññ

ýòî intermediate êëàññ, óíàñëåäîâàííûé íåïîñðåäñòâåííî îò ORM è ÿâëÿþùéèñÿ áàçîâûì äëÿ âñåõ êëàññîâ îáúåêòíîé ìîäåëè.

Ïåðâîíà÷àëüíûé (Primary) êëàññ

ýòî êëàññ óíàñëåäîâàííûé íåïîñðåäñòâåííî îò Initial êëàññà.

Èíèöèèðóþùèé êëàññ

Ïåðâûì øàãîì â èñïîëüçîâàíèè ORM áóäåò ÿâëÿòñÿ ñîçäàíèå èíèöèèðóþùåãî êëàññà îáúåêòíîé ìîäåëè. Èíèöèèðóþùèé êëàññ ïóòåì çàäàíèÿ ïàðàìåòðîâ â ìåòîäå _init è ïóòåì ïåðåîïðåäåëåíèÿ ìåòîäîâ êëàññà ORM ìîæåò óñòàíàâëèâàòü îáùåå äëÿ âñåé ìîäåëè ïîâåäåíèå.

Íàïðèìåð, çàäàòü èñïîëüçóåìûé ðàçìåð êýøà, óñòàíîâèòü ñîîòâåòñòâèå èìåí ORM-êëàññîâ è òàáëèö ÁÄ èëè óêàçàòü ñîîòâåòñòâèå òèïîâ ïîëåé òàáëèöû êëàññàì ñîîòâåòñòâóþùèõ ñâîéñòâ îáúåêòîâ.

Äëÿ ìîäåëè ìóçûêàëüíîé êîëëåêöèè ýòî áóäåò êëàññ

Êëàññ Music::ORM íàñëåäóåòñÿ îò ORM è áóäåò ÿâëÿòñÿ áàçîâûì äëÿ âñåõ êëàññîâ îáúåêòíîé ìîäåëè.

Êëàññ Music::Song - îäèí èç êëàññîâ îáúåêòíîé ìîäåëè ìóçûêàëüíîé êîëëåêöèè,
íàñëåäóåòñÿ îò áàçîâîãî êëàññà ìîäåëè Music::ORM.
Èíôîðìàöèþ î ñâîéñòâàõ îáúåêòîâ ýòîãî êëàññà è î ñâÿçÿõ ñ äðóãèìè îáúåêòàìè
ORM áåðåò èç áàçû äàííûõ, êàæäîìó êëàññó â ñîîòâåòñòâèå êëàññó îáúåêòàì êëàññà ñîîòâåòñòâóþò
named 'Music_Song' you can change its suggested name by overriding method
ORM->_guess_table_name() or by specifying 'table' argument in use clause.

×àñòè÷íàÿ çàãðóçêà (lazy_load)

Ìåòîäû

_init

history_class

Îïðåäåëÿåò êëàññ, êîòîðûé áóäåò èñïîëüçîâàòüñÿ äëÿ çàïèñè è õðàíåíèÿ èñòîðèè èçìåíåíèÿ îáúåêòîâ íàøåé ìîäåëè. Ïîäðîáíîñòè î êëàññå Todo::History íèæå.

Åñëè ïàðàìåòð íå óêàçàí - èñòîðèÿ áóäåò îòêëþ÷åíà äëÿ âñåé ìîäåëè.

Íåîáõîäèìîñòü âåäåíèÿ èñòîðèè, åñëè îíà âêëþ÷åíà äëÿ ìîäåëè, ìîæíî óñòàíàâèëèâàòü èíäèâèäóàëüíî äëÿ êàæäîãî êëàññà, à òàê æå äëÿ êàæäîãî îòäåëüíîãî âûçîâà ìåòîäîâ ñîçäàíèÿ, èçìåíåíèÿ è óäàëåíèÿ îáúåêòîâ.

prefer_lazy_load

Îòäàâàòü ïðåäïî÷òåíèå ÷àñòè÷íîé çàãðóçêå îáúåêòîâ ïî óìîë÷àíèþ. Ïîäðîáíåé î ÷àñòè÷íîé çàãðóçêå îáúåêòîâ ñìîòðèòå â ORM(5).

emulate_foreign_keys

Ïàðàìåòð, ïîçâîëÿþùèé âêëþ÷èòü ïðîâåðêó öåëîñòíîñòè äàííûõ íà óðîâíå ORM äëÿ áàç äàííûõ, íå ïîääåðæèâàþùèõ âíåøíèå êëþ÷è.

default_cache_size

Çàäàåò ðàçìåð êýøà îáúåêòîâ.

ORM íå èñïîëüçóåò îáùèé êýø äëÿ âñåõ îáúåêòîâ, âìåñòî ýòîãî êýø ñîïîñòàâëÿåòñÿ êàæäîìó ïåðâîíà÷àëüíîìó êëàññó (êëàññó, óíàñëåäîâàííîìó íåïîñðåäñòâåííî îò èíèöèèðóþùåãî êëàññà) è èñïîëüçóåòñÿ äëÿ êýøèðîâàíèÿ åãî ïðåäñòàâèòåëåé è ïðåäñòàâèòåëåé âñåõ åãî ïîòîìêîâ.

Äàæå åñëè ðàçìåð êýøà óñòàíîâëåí â 0, òî îáúåêò óæå çàãðóæåííûé â ïàìÿòü íå áóäåò ïîâòîðíî çàãðóæàòüñÿ èç áàçû. Òî åñòü:

$a = Todo::Task->find_id( id=1 );
$b = Todo::Task->find_id( id=1 );

îáðàòèòüñÿ ê ÁÄ âñåãî îäèí ðàç à íå äâà. Êðîìå òîãî $a è $b áóäóò ñîäåðæàòü îäèí è òîò æå îáúåêò.

db

Èñïîëüçóåìûé äðàéâåð ÑÓÁÄ. Ïîäðîáíåé ÷èòàéòå â ORM::Db(5).

SEE ALSO

http://sourceforge.net/projects/perlorm

AUTHOR

Alexey V. Akimov

COPYRIGHT AND LICENSE

Copyright (C) 2005 by Alexey V. Akimov

This library is free software; you can redistribute it and/or modify it under the terms of LGPL licence.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 3:

Non-ASCII character seen before =encoding in 'äëÿ'. Assuming CP1252