Deməli, təsəvvür elə ki, sən mürəkkəb bir funksiya və ya prosedur yazmısan. Artıq görürsən ki, sənin database necə bomba işləyir, amma birdən — bax! — datalar düz gəlmir, sorğular gec işləyir və rəhbərlik əsəbləşməyə başlayır. Bax, bu anda debug səhnəyə çıxır.
PL/pgSQL-də debug ona görə lazımdır ki:
- Logika səhvlərini tapasan, məsələn, funksiya gözlənilən nəticəni qaytarmırsa.
- Daxil olan datalarla bağlı problemləri başa düşəsən. Çünki bəzən database istifadəçiləri təkcə data yox, həm də... tam anlaşılmaz bir şey daxil edirlər!
- Performance problemlərini aradan qaldırasan. Axı tələsik yazılmış kod bəzən Səhra səhrasında Wi-Fi axtaran tısbağa kimi işləyə bilər.
Ciddi desək, debug təkcə səhv tapıb düzəltmək deyil. Bu, kodunu yaxşılaşdırmaq, onu daha sürətli, effektiv və oxunaqlı etmək yoludur.
PL/pgSQL-də debug-un əsas yanaşmaları
PL/pgSQL-də debug bir neçə üsulla aparıla bilər. Gəlin, bunları bir-bir nəzərdən keçirək.
- PostgreSQL-in daxili alətlərindən istifadə
PostgreSQL diaqnostika üçün bir neçə daxili imkan verir, o cümlədən loglama funksiyaları (RAISE NOTICE və RAISE EXCEPTION), həmçinin sorğunun icra planının analizi (EXPLAIN ANALYZE). Bu alətlər sənə funksiyanın içində nə baş verdiyini başa düşməyə kömək edir.
RAISE NOTICEilə loglama
RAISE NOTICE — sənin dostundur, əgər başa düşmək istəyirsənsə ki, hansı datalar funksiyadan keçir, hansı mərhələdə nəsə düz getmir, ya da dəyişənlərin dəyərlərini yoxlamaq istəyirsənsə. RAISE EXCEPTION-dan fərqli olaraq, o, funksiyanın icrasını dayandırmır. Məsələn, hər mərhələdə dəyişənin dəyərini çıxara bilərsən.
DO $$
DECLARE
counter INT := 0;
BEGIN
FOR counter IN 1..5 LOOP
RAISE NOTICE 'Cari sayğac dəyəri: %', counter;
END LOOP;
END $$;
Bu kod counter-in 1-dən 5-ə qədər olan dəyərlərini çıxarır. Sadə bir sehr, amma debug üçün çox faydalıdır!
- Üçüncü tərəf alətlərindən istifadə
PL/pgSQL-də debug eləmək üçün pgAdmin kimi alətlərdən (GUI interfeysi ilə) istifadə edə bilərsən. Orda breakpoint qoymaq və dəyişənlərin dəyərlərini real vaxtda görmək olur. Əgər vizual köməkçiləri sevirsənsə, pgAdmin sənin əla köməkçin olacaq.
Debug-un mərhələləri
Funksiya və ya prosedurun debug-una başlayanda, vacibdir ki, müəyyən ardıcıllığa əməl edəsən. Hər mərhələyə bir az daha yaxından baxaq:
- Daxil olan dataların analizi
İlk növbədə başa düşmək lazımdır ki, daxil olan datalar düzgündürmü. Funksiyanın aldığı datalarda səhv və ya gözlənilməz dəyərlər yoxdurmu? Məsələn, bütün input parametrləri RAISE NOTICE ilə yoxlaya bilərsən:
CREATE FUNCTION check_input(x INTEGER) RETURNS VOID AS $$
BEGIN
IF x IS NULL THEN
RAISE EXCEPTION 'Daxil olan dəyər NULL olmamalıdır!';
END IF;
RAISE NOTICE 'Daxil olan dəyər: %', x;
END;
$$ LANGUAGE plpgsql;
Bu nümunə göstərir ki, istifadəçiləri input datalarla bağlı problemlər barədə necə xəbərdar etmək olar.
- Hər mərhələnin icrasını yoxlamaq
Funksiyanı məntiqi bloklara böl və əsas nöqtələrdə RAISE NOTICE əlavə et. Bu, sənə harada nəsə düz getmədiyini başa düşməyə kömək edəcək.
CREATE FUNCTION calculate_discount(price NUMERIC, discount NUMERIC) RETURNS NUMERIC AS $$
BEGIN
RAISE NOTICE 'Funksiyanın başlanğıcı: qiymət %, endirim %', price, discount;
IF price <= 0 THEN
RAISE EXCEPTION 'Qiymət mənfi və ya sıfır ola bilməz!';
END IF;
IF discount < 0 OR discount > 100 THEN
RAISE EXCEPTION 'Endirim 0 ilə 100 arasında olmalıdır!';
END IF;
RETURN price - (price * discount / 100);
END;
$$ LANGUAGE plpgsql;
Burada debug zamanı hər mərhələdə prosesin vəziyyəti barədə faydalı mesajlar çıxarılır.
- Optimallaşdırma və problemlərin aradan qaldırılması
- Səhvi tapandan sonra onu düzəlt. Əgər problem performance ilə bağlıdırsa,
EXPLAIN ANALYZEkimi analiz alətlərindən istifadə et ki, sorğuları optimallaşdırasan.
Debug bacarıqlarının praktik tətbiqi
Gəlin real bir tapşırığa baxaq: bizdə bir funksiya var, o, cədvələ qeyd əlavə edir və yaradılmış id-ni qaytarır. Hər şey məntiqli və sadə görünür, amma bəzən funksiya səhvlə bitir və biz başa düşmək istəyirik niyə.
Orijinal funksiya:
CREATE FUNCTION add_student(name TEXT, age INTEGER) RETURNS INTEGER AS $$
DECLARE
new_id INTEGER;
BEGIN
INSERT INTO students (name, age) VALUES (name, age) RETURNING id INTO new_id;
RETURN new_id;
END;
$$ LANGUAGE plpgsql;
Əgər bu funksiyanı səhv data ilə çağırsan, məsələn, age < 0, o, səhv verir. Gəlin, debug vasitələri ilə onu yaxşılaşdıraq.
Loglama ilə yaxşılaşdırılmış funksiya:
CREATE FUNCTION add_student(name TEXT, age INTEGER) RETURNS INTEGER AS $$
DECLARE
new_id INTEGER;
BEGIN
-- Daxil olan dataları log edirik
RAISE NOTICE 'Tələbə əlavə olunur: ad %, yaş %', name, age;
-- Yaşın düzgünlüyünü yoxlayırıq
IF age < 0 THEN
RAISE EXCEPTION 'Yaş mənfi ola bilməz!';
END IF;
-- Tələbəni əlavə edirik və onun ID-sini qaytarırıq
INSERT INTO students (name, age) VALUES (name, age) RETURNING id INTO new_id;
-- Uğurlu icranı log edirik
RAISE NOTICE 'Tələbə əlavə olundu, ID %', new_id;
RETURN new_id;
END;
$$ LANGUAGE plpgsql;
İndi, əgər səhv baş versə, sən dəqiq biləcəksən ki, nə düz getməyib, çünki RAISE NOTICE ilə mesajlar çıxacaq.
Sonda faydalı məsləhətlər
- İş kodunda lazımsız loglamanı silməyi unutma.
RAISE NOTICEdebug üçün əla alətdir, amma onu həmişə istifadə etsən, prod loglarını doldura bilər. - Kiçik kod hissələri ilə işləməyə çalış. Əgər funksiya çox mürəkkəbdirsə, onu bir neçə hissəyə böl. Bu, debug-u asanlaşdıracaq.
- Daim məşq elə. Nə qədər çox kod yazıb debug etsən, səhvləri tapıb düzəltməkdə bir o qədər sürətli olacaqsan.
Debug — detektiv oyunu kimidir, sadəcə böyüdücü şüşə əvəzinə səndə SQL-sorğular və PL/pgSQL məntiqi var. Bu işdə ustalıq təcrübə ilə gəlir, amma hər düzəltdiyin bug səni bir az daha yaxşı edir!
GO TO FULL VERSION