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