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:
- Hesabatı yaradan PL/pgSQL prosedurunun yaradılması.
- Nəticələrin loglanmasının qurulması (əgər lazımdırsa).
- 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,orderscədvəlindən ümumi gəliri hesablayaq.- Hesabat tarixi (
report_date) həmişə cari tarixə (CURRENT_DATE) bərabərdir. - Nəticə
sales_report_logcədvəlinə yazılır. RAISE NOTICEmesajı 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:
- Lazım olan komanda ilə SQL faylı yarat:
echo "SELECT generate_daily_sales_report();" > /path/to/script.sql
psqlilə faylı icra et:
psql -h localhost -U postgres -d your_database -f /path/to/script.sql
Bu komandanı task scheduler-ə əlavə et:
Linux/macOS-da:
crontab -eilə:0 0 * * * psql -h localhost -U postgres -d your_database -f /path/to/script.sqlWindows-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 (
cronvə ya Task Scheduler) güvən və SQL-ipsqlilə 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
- 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;
- 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.
GO TO FULL VERSION