Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 03:04 08.06.24 
Компютри и Интернет
   >> Perl
Всички теми Следваща тема *Кратък преглед

Тема Дайте мнения за тази идея?  
Авторlele (Нерегистриран)
Публикувано07.06.03 01:39




Здравейте.
Предполагам, че повечето от вас използват Perl за каквото и аз - web програмиране.
Това с което съм се сблъсквал досега е било горе-долу почти едно и също - вземане на стойности от базата данни, промяната им, изтриване и др. подобни действия, както и разбира се - обработката на шаблони в HTML кода, за да се изпринтят желаните стойности.
При писането на кодове, въпреки усилията чрез подаване на различни параметри, и по този начин генерирайки разновидности на SQL стрингове, винаги ми се е налагало да имам по няколко функции, които да обработват по различен начин данните от базата. В случая говоря специално и единствено за вземането им.
И когато имам една основна таблица с примерно 25-40 колони и свързаните с това понякога десетки други таблици релативни към Основната, и имам нуждата да вземам примерно по 15 различни начина тези данни, понеже не винаги искам да вземам всички данни от таблиците, става една дълга и широка ...
Та стига съм се отплесвал, а да си дойда на думата.
Идеята ми е, вместо да пиша примерно 15 различни функции според начина по които искам да взема данните, да направя едно Описание на Основната таблица и на това как тя се свързва с другите таблици, и използвайки това описание да генерирам подходящия SQL израз, чрез който да взема исканите данни, по желания начин. И това вземане с помощта на описанието да стане само с една и винаги да е с тази една функция. Един SQL израз обаче може да бъде доста комплексен при такъв брой на колони и таблици. Какво трябва да бъде това описание, за да направя това което искам?!

Какво все пак имаме при един SQL израз?
В най-общия случай, това: SELECT колони FROM таблици WHERE условия_за_селекция;
Да го разделим на 3 части:
1 - SELECT колони
2 - FROM таблици
3 - WHERE условия_за_селекция

Какви типове колони имаме, пак в най-общ вид:
1. Прости - такива който не ни сързват с други таблици, трябват ни директните им стойности
2. Релативни - Такива чрез които свързваме две таблици
2.1. - За връзки от тип One To One
2.2. - За връзки от тип One To Many
3. Участващи в условия за селекция в WHERE часта на стринга.

Да разгледаме следната структура (Не всички ключове във вътрешния хеш е нужно да участват, ще обясня после):
{някоя_колона} => {таблица_за_релация} = Име на таблицата с която някоя_колона образува релация
{колони_за_вземане} = Имената на колоните от таблица_за_релация на които искаме да вземем стойностите
{колона_за_релация} = Името на колоната от таблица_за_релация чрез която свързваме двете таблици
{колона_за_WHERE_условие} = Името на колоната която участва при дадено условие в WHERE часта
{Синтаксис_при_SELECT} = синтаксис в SELECT часта на SQL-а, който можем да искаме да използваме за тази колона
{Синтаксис_при_WHERE} = синтаксис в WHERE часта на SQL-а, който можем да искаме да използваме за тази колона

Сега да обясня за какво ще ми послужи тази структура.

{таблица_за_релация} - когато колона е от тип 2.1, значи трябва да свържем две таблици. Трябва да укажем кои са тези таблици:
FROM table_1, table_2 ...
Стойноста на този ключ ни дава реалното име на table_2. table_1 я знаем, тя си ни е основната таблица, тази с десетките колони.

{колони_за_вземане} - когато свързваме две таблици, искаме да вземем определени колони от тях. Стойноста на този ключ ни дава имената на колоните от table_2. Колоните от table_1 (основната) ги знаем, това са външните ключове (някоя_колона).
SELECT някоя_колона, table_2.some_column_1, table_2.some_column_x ...
(в момента не ме интересува каква е стойноста на този ключ, т.е. имената на колоните от table_2, дали е масив с имената им, и после ги join-вам, или пък са директно като стринг)

{колона_за_релация} - Името на колоната от table_2 чрез която осъществявам релацията. Името на колоната от table_1 e някоя_колона.
WHERE някоя_колона = table_2.колона_за_релация ...

{колона_за_WHERE_условие} - Това е в случай, че имам колона от тип 3. Не мога да разчитам, че това е колоната някоя_колона, тъй като може някоя_колона да участа само в релацията.
WHERE колона_за_WHERE_условие = x ...
(колона_за_WHERE_условие може да е някоя_колона или колона от table_2)

{Синтаксис_при_SELECT} - ако например колоната е тип 'date' (в базата данни), евентуално ще искам да я форматирам по някакъв начин. Не мога просто да напиша SELECT някоя_колона ... , а ще искам например да е
SELECT YEAR(някоя_колона) ...
Ако искам да е подобно, указвам го като стойност на този ключ.

{Синтаксис_при_WHERE} - подобно като {Синтаксис_при_SELECT}, но важи за WHERE часта на SQL-a. Например:
WHERE MONTH(някоя_колона) = x ...

Ето един пример на цялата работа:

MainTable Country
------------------------------ -------------------------
| ID | Country_id | date_add | | cnt_id | country_name |
------------------------------ -------------------------

%structure = ( ID => { колона_за_WHERE_условие => 'ID' },
Country_id => { таблица_за_релация => 'Country',
колони_за_вземане => 'country_name',
колона_за_релация => 'cnt_id',
колона_за_WHERE_условие => 'country_name' },
date_add => { Синтаксис_при_SELECT => 'MONTH(date_add)' } );

Исканият SQL стринг според описанието трябва да е:

SELECT ID, Country_id, country_name, MONTH(date_add)
FROM MainTable, Country
WHERE ID = x AND Country_id = cnt_id AND country_name = 'България';

Някой сигурно ше попита откъде се взе тва MainTable, или това х, или пък България?
Ами MainTable е Основната таблица за която говорих, името и ще е в отделна променлива, но може да бъде променено това.
х, България - това са външни стойности, евентуално дошли като параметър на CGI скрипта или откъдето искате, не е от значение. Това как ще се появят там съм го измислил по подобен начин, доста по-прост обаче от %structure, но няма да се спирам на това сега.

Значи това е основната идея, определено има какво да се добави към нея, но и без това поста стана доста обемист, а предполагам и труден за разбиране.
Ще съм благодарен за мнения и/или предложения по подобни въпроси.
Чао от мен, и have fun with Perl :-)

P.S. тук не разглеждам начин за вземане на данни от тип 2.2. - One To Many, понеже това не става по този начин, налага се допълнителна обработка на подобни данни, за да се приведат във вид за заместване на шаблони в HTML.
]



Тема Re: Дайте мнения за тази идея?нови [re: lele]  
Авторking (Нерегистриран)
Публикувано07.06.03 05:04



Vij, v edno si prav, postinga e dosta trudno razbiraem.
Shvanah za k'wo goworish, oba4e li4no za men towa ste sazdade samo po-golqma mess.az rabotq dosta s MySQL (kato neprofesionalen programist) i sam pravil k'wi li ne izpalneniq no do takiwa hash relacii ne sam dostigal.Moje i da stane super za tebe kito si "watre" no za wseki otwan ste izglejda boza:).

Sega k'wo moga da kaja po sastestwo:
1.Az polzvam placeholders kogato iskam da avtomatiziram select proces.
2.Ili wartq prez loop s dobawqne kam string (sas zapetaiki i tem podobni) i posle prosto go wikam.
3.ideqta ne e losha ama samo gledaj da ne se omotash w tiq hash reference 4e az wadnaj takawa boza satworih 4e sled 1 mesec mi trqbwashe 1 den da razbera adjeba za kakwo ide re4.(a go pisah li4no).
4.trebwa da stane kato modul i da mu podawash to4no opredeleni parametri(w hash ili array) i da wrasta samo edin hash(array) ina4e ste stane palna boza.
ta w toq red na misli sto ne si napravish hash ili array-> table, column_to_select,
clause i da gi pratish do modula i tam da gi wrazwash i exsecute i so for.

kolkoto po prosta e konstrukciqta,tolkowa po dobre.
E modula stawa po-slojen ama go pishesh edin put.
ama kakto az go wijdam ne nisto slojno.
ami towa e.
i az mrazq da rabotq s mnogo tablici 4e im gubq kraq i zatowa gledam da gi svejdam do minimum.
Sorry about cyrilic ama me marsi da ciriliziram Linux:)))
haide,sas zdrawe.



Тема Re: Дайте мнения за тази идея?нови [re: king]  
АвторPavel (Нерегистриран)
Публикувано07.06.03 10:05



A kakwo shte kajete za DBIx?



Тема Re: Дайте мнения за тази идея?нови [re: lele]  
Авторraptor (Нерегистриран)
Публикувано09.06.03 18:02



Ima nqkolko Object Oriented interfeisa za polzwane na Bozi ot danni... Seshtam se za SPOS mai se kazwashe... edna ot tqh...
Po princip az nawremeto si bqh naprawil edno modulche ... ideqta beshe slednata chrez Hash-owe opiswahash nestata i posle na bazata na tozi hash (beshe baq sloven) se generirat kakto HTML-FORM-ite taka i SQL zaqwkite... kato generirashe ne samo SELECT ami i DELETE i INSERT.. w mnogo tablici... aaa i da ne zabrawq towa wsichko beshe wyrzano i s JavaScript koito praweshe prowerka za walidnost na dannite...




Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.