CodeGym /Kurslar /SQL SELF /PL/pgSQL-də debug-a giriş

PL/pgSQL-də debug-a giriş

SQL SELF
Səviyyə , Dərs
Mövcuddur

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.

  1. PostgreSQL-in daxili alətlərindən istifadə

PostgreSQL diaqnostika üçün bir neçə daxili imkan verir, o cümlədən loglama funksiyaları (RAISE NOTICERAISE 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.

  1. RAISE NOTICE ilə 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!

  1. Üçü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:

  1. 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.

  1. 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.

  1. Optimallaşdırma və problemlərin aradan qaldırılması
  2. Səhvi tapandan sonra onu düzəlt. Əgər problem performance ilə bağlıdırsa, EXPLAIN ANALYZE kimi 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

  1. İş kodunda lazımsız loglamanı silməyi unutma. RAISE NOTICE debug üçün əla alətdir, amma onu həmişə istifadə etsən, prod loglarını doldura bilər.
  2. 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.
  3. 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!

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
RAISE EXCEPTION və RAISE NOTICE ilə daxil olan məlumatların yoxlanılması
RAISE EXCEPTION və RAISE NOTICE ilə daxil olan məlumatların yoxlanılması
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION