CodeGym /Kurslar /SQL SELF /Cədvəl üzrə avtomatik hesabatların yaradılması

Cədvəl üzrə avtomatik hesabatların yaradılması

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

Kiçik verilənlər bazası ilə işləyəndə, hesabatlar üçün sorğuları və ya prosedurları əl ilə işə salmaqda heç bir problem yoxdur. Amma real dünyada verilənlər bazası elə böyüyür ki, təkrarlanan işləri avtomatlaşdırmaq lazımdır. Təsəvvür elə, hər gün səndən satışlar üzrə hesabat istənilir. Hətta sorğu iki dəqiqə vaxt aparsa belə, il ərzində sən bunun üçün 12 saatdan çox vaxt sərf edəcəksən. O saatları daha yaxşı kofe içib dincəlmək üçün istifadə edərdin, qoy avtomatik prosedur hər şeyi özü həll etsin.

Avtomatlaşdırma sənə kömək edəcək:

  • Əl əməyini azaltmağa.
  • Hesabatların müntəzəmliyini təmin etməyə (məsələn, gündəlik, həftəlik hesabatlar).
  • İnsan faktoru ilə bağlı səhvlərin ehtimalını minimuma endirməyə.
  • Hesabatlarına inamı artırmağa: onlar həmişə təyin olunmuş parametrlərlə yaradılır.

Avtomatik hesabat yaradılmasının əsas addımları

Hesabatların avtomatik icrası aşağıdakı mərhələləri əhatə edir:

  1. Hesabatı yaradan PL/pgSQL prosedurunun yaradılması.
  2. Nəticələrin loglanmasının qurulması (əgər lazımdırsa).
  3. Prosedurun cədvəl üzrə işə salınması üçün task scheduler-dən istifadə.

Gəlin bunu addım-addım həyata keçirək!

Hesabat yaratmaq üçün prosedurun yaradılması

Əvvəlcə sadə bir prosedur yaradaq, hansı ki, bu gün üçün bütün sifarişlər üzrə ümumi gəliri hesablayacaq və nəticəni log cədvəlinə yazacaq. Log üçün cədvəlimiz artıq var (adını qoyaq sales_report_log):

CREATE TABLE sales_report_log (
    report_date DATE NOT NULL,
    total_sales NUMERIC NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

İndi PL/pgSQL dilində prosedur yaradaq:

CREATE OR REPLACE FUNCTION generate_daily_sales_report()
RETURNS VOID AS $$
BEGIN
    -- Bu gün üçün ümumi gəliri hesabla
    INSERT INTO sales_report_log (report_date, total_sales)
    SELECT CURRENT_DATE, SUM(order_total)
    FROM orders
    WHERE order_date = CURRENT_DATE;

    RAISE NOTICE 'Hesabat % üçün uğurla yaradıldı', CURRENT_DATE;
END;
$$ LANGUAGE plpgsql;

Burada nə baş verir:

  • SUM() aggregate funksiyasından istifadə edirik ki, orders cədvəlindən ümumi gəliri hesablayaq.
  • Hesabat tarixi (report_date) həmişə cari tarixə (CURRENT_DATE) bərabərdir.
  • Nəticə sales_report_log cədvəlinə yazılır.
  • RAISE NOTICE mesajı debug üçün əlavə olunub: o bildirir ki, hesabat uğurla yaradılıb.

Prosedurun test edilməsi

Bu proseduru avtomatlaşdırmazdan əvvəl, onu əl ilə test etmək həmişə faydalıdır. Funksiyanı işə salaq:

SELECT generate_daily_sales_report();

İndi isə sales_report_log cədvəlinin məzmununa baxaq:

SELECT * FROM sales_report_log;

Əgər cari tarixli və düzgün ümumi gəlirli sətri görürsənsə — təbriklər, funksiyan işləyir!

PostgreSQL-də taskların avtomatlaşdırılması

Bəzən faydalı olur ki, verilənlər bazası özü nəsə etsin: hesabatları işə salsın, köhnə qeydləri təmizləsin və ya aggregatları cədvəl üzrə yeniləsin. PostgreSQL bunu pg_cron extension-u və ya xarici task scheduler — sistem cron və ya Task Scheduler ilə etmək imkanı verir.

Əgər Linux-da işləyirsənsə, ən yaxşı seçim pg_cron-dur. Bu extension SQL-i birbaşa PostgreSQL-in içində işə salır, shell və ya skriptlərə ehtiyac yoxdur.

pg_cron-u belə quraşdıra bilərsən (unutma, XX-u PostgreSQL versiyanla əvəz elə):

sudo apt install postgresql-XX-cron

Quraşdırmadan sonra onu konfiqurasiyada qoşmaq lazımdır. postgresql.conf-u aç və sətri əlavə et:

shared_preload_libraries = 'pg_cron'

Sonra PostgreSQL-i restart elə və extension-u bazanda aktivləşdir:

CREATE EXTENSION pg_cron;

İndi task planlaşdıra bilərsən. Məsələn, generate_daily_sales_report() funksiyasını hər gün gecə saat 12-də işə salmaq üçün:

SELECT cron.schedule(
    'daily_sales_report',
    '0 0 * * *',
    $$ SELECT generate_daily_sales_report(); $$
);

Burada:

  • 'daily_sales_report' — taskın adı;
  • '0 0 * * *' — cron stilində cədvəl (bu halda — hər gün 00:00-da);
  • $$ arasındakı SQL — icra olunacaq kod.

Bütün planlaşdırılmış tasklara baxmaq üçün istifadə et:

SELECT * FROM cron.job;

Əgər Windows və ya macOS-da işləyirsənsə, pg_cron ya ümumiyyətlə dəstəklənmir (Windows-da), ya da mənbə kodundan əl ilə yığmaq lazımdır (macOS-da). Bu narahatdır və çox vaxt sistem planlaşdırıcısından istifadə etmək daha asandır.

Bax belə edə bilərsən:

  1. Lazım olan komanda ilə SQL faylı yarat:
echo "SELECT generate_daily_sales_report();" > /path/to/script.sql
  1. psql ilə faylı icra et:
psql -h localhost -U postgres -d your_database -f /path/to/script.sql
  1. Bu komandanı task scheduler-ə əlavə et:

    • Linux/macOS-da: crontab -e ilə:

      0 0 * * * psql -h localhost -U postgres -d your_database -f /path/to/script.sql
      
    • Windows-da: Task Scheduler-də task yaradıb, psql.exe-ni lazım olan parametrlərlə işə sal.

  • Əgər Linux-dasan, pg_cron-dan istifadə et — rahatdır və PostgreSQL-ə inteqrasiya olunub.
  • Windows və ya Mac-dasan, sistem planlaşdırıcısına (cron və ya Task Scheduler) güvən və SQL-i psql ilə işə sal.

Beləliklə, PostgreSQL-də istənilən taskı əlavə əziyyətsiz avtomatlaşdıra bilərsən.

Avtomatik hesabatlıq nümunələri

  1. Regionlar üzrə gündəlik hesabat

Tutaq ki, hər region üzrə gəlir hesabatını avtomatik yaratmaq istəyirsən. Funksiyamızı belə genişləndirə bilərsən:

CREATE OR REPLACE FUNCTION generate_regional_sales_report()
RETURNS VOID AS $$
BEGIN
    INSERT INTO regional_sales_report_log (region, report_date, total_sales)
    SELECT region, CURRENT_DATE, SUM(order_total)
    FROM orders
    WHERE order_date = CURRENT_DATE
    GROUP BY region;

    RAISE NOTICE 'Region üzrə hesabat % üçün uğurla yaradıldı', CURRENT_DATE;
END;
$$ LANGUAGE plpgsql;
  1. Aylıq hesabat

Eyni qaydada ay üzrə hesabat üçün prosedur yarada bilərsən. Sadəcə sorğudakı filteri dəyiş:

WHERE order_date BETWEEN date_trunc('month', CURRENT_DATE)
                     AND date_trunc('month', CURRENT_DATE) + interval '1 month - 1 day';

Tipik səhvlər və onların qarşısının alınması

Avtomatik hesabat yaradanda belə problemlər ola bilər:

  • Funksiyada sintaksis səhvi: funksiyaları avtomatlaşdırmazdan əvvəl həmişə əl ilə test et.
  • Taskların icra tezliyi: əgər task çox tez-tez işə düşürsə, verilənlər bazasını yükləyə bilər. Cədvəli ağılla qur.
  • Məlumatların təkrarlanması: əgər hesabat gün ərzində bir neçə dəfə işə düşürsə, təkrarlar ola bilər. Təkrarlanmaların qarşısını almaq üçün unikal açarlardan istifadə et.

Bu mühazirədə göstərdik ki, PostgreSQL-də avtomatik hesabat yaradılmasını necə qurmaq olar. İndi analitik proseslərini optimallaşdıra bilərsən və daha vacib işlərə vaxt ayıra bilərsən... məsələn, bug axtarmaq, kod yazmaq və ya SQL sorğularının perfektsionizmi haqqında xəyal qurmaq kimi.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION