PostgreSQL-də kütləvi məlumat yükləmək — tetris oynamaq kimidir: bütün detallar (məlumatlar) mövcud cədvələ (verilənlər bazasının strukturu) ideal şəkildə oturmalıdır. Amma oyunlarda olduğu kimi, tez-tez səhvlər çıxır və bu, prosesi ləngidə və ya tam çökdürə bilər. Qarşına data type uyğun gəlməməsi, encoding problemləri, təkrarlanan qeydlər, bəzən isə gözlənilməz access error-lar çıxa bilər.
Görəsən, hansı səhvlər olur, onları necə tapıb həll etmək olar? Bu gün ən çox rast gəlinən problemləri detallı şəkildə izah edəcəyik ki, sən də kütləvi məlumat yükləmədə əsl ustaya çevriləsən.
Məlumat strukturu uyğunsuzluğu səhvləri
Data type problemləri
Çox vaxt məlumat yükləyəndə belə bir error görə bilərsən:
ERROR: integer tipi üçün input sintaksisi səhvdir: "abc"
CONTEXT: COPY telebeler, sətr 3, sütun age: "abc"
Bu, CSV faylındakı məlumatlar gözlənilən sütun tipinə uyğun gəlməyəndə baş verir. Məsələn, age sütununda rəqəm gözlənilir, amma məlumatda "abc" string-i var. PostgreSQL text-i rəqəmə çevirməyi bacarmır və yükləmə prosesi dayanır.
Necə qarşısını almaq olar?
- CSV faylını yükləməzdən əvvəl yoxla. Excel və ya Python-da işləyirsənsə, bütün sütunların gözlənilən type-a uyğun olduğuna əmin ol.
- Əgər yenə də error çıxırsa, əvvəlcə bütün sütunları
TEXTolan aralıq cədvələ yükləyib sonra convert et:
UPDATE temp_telebeler
SET age = CAST(age AS INTEGER)
WHERE age ~ '^\d+$';
Çatışmayan sütunlar
Cədvəlin strukturu CSV faylındakı məlumatlarla uyğun gəlmirsə, PostgreSQL error verəcək. Məsələn:
ERROR: "email" sütunu üçün məlumat çatışmır
CONTEXT: COPY telebeler, sətr 2: "John,Doe,21"
Bu, adətən CSV-də başlıqlar (və ya sütunların sırası) cədvəlin strukturundan fərqli olanda olur.
Necə qarşısını almaq olar? COPY əmri ilə həmişə doldurmaq istədiyin sütunların siyahısını ver:
COPY telebeler (first_name, last_name, age)
FROM '/path/to/file.csv'
DELIMITER ','
CSV HEADER;
Encoding səhvləri
Müxtəlif encoding-lərlə bağlı problemlər
Əgər CSV faylın UTF-8-dən fərqli encoding-də (məsələn, Windows-1251) saxlanılıbsa, PostgreSQL faylı başa düşməyə bilər. Bu, xüsusilə məlumatda kiril simvolları varsa, error verir:
ERROR: "UTF8" encoding-i üçün səhv byte ardıcıllığı: 0xd0
CONTEXT: COPY telebeler, sətr 1
Necə qarşısını almaq olar?
- CSV faylının UTF-8-də saxlanıldığından əmin ol.
- Əgər bu mümkün deyilsə, yükləmə zamanı faylın encoding-i göstər:
COPY telebeler FROM '/path/to/file.csv'
DELIMITER ','
CSV HEADER
ENCODING 'WIN1251';
Fayla giriş səhvləri
Access hüquqları ilə bağlı problemlər
COPY əmri istifadə edəndə, PostgreSQL yüklədiyin fayla giriş imkanı olmalıdır. Əgər fayl əlçatmazdırsa, belə bir error görəcəksən:
ERROR: "/path/to/file.csv" faylını oxumaq mümkün olmadı: Permission denied
Hətta belə də ola bilər:
ERROR: belə bir fayl və ya qovluq yoxdur
Necə qarşısını almaq olar?
- PostgreSQL-in fayla giriş imkanı olduğuna əmin ol. Linux-da bu, access hüquqları ilə bağlı ola bilər. Access vermək üçün
chmodistifadə et:chmod 644 /path/to/file.csv - Əgər lokal kompüterdə işləyirsənsə,
\COPYəmrindən istifadə et,COPYyox.
Təkrarlanan məlumat problemləri
UNIQUE constraint-i olan cədvəllərə (məsələn, unikal id-lər) məlumat yükləyəndə konfliktlərlə rastlaşa bilərsən:
ERROR: təkrarlanan açar dəyəri "telebeler_pkey" unique constraint-ni pozur
DETAIL: Açar (id)=(1) artıq mövcuddur.
Bu, CSV faylında təkrarlanan qeydlər və ya cədvəldə artıq olan məlumatlar olduqda baş verir.
Necə qarşısını almaq olar?
ON CONFLICTopsiyasından istifadə et ki, təkrarlanan dəyərlər işlənilsin:INSERT INTO telebeler (id, first_name, last_name) VALUES (1, 'John', 'Doe') ON CONFLICT (id) DO NOTHING;
COPYvə ya\COPYistifadə edirsənsə, əvvəlcə məlumatı aralıq cədvələ yüklə, sonra əsas cədvələ təkrarlananları işləyərək əlavə et.
Boş dəyərlərlə bağlı səhvlər
PostgreSQL-də NOT NULL constraint-i olan sütunlar boş dəyərlərə icazə vermir. CSV faylında boş sütunlar varsa, belə bir error görə bilərsən:
ERROR: "email" sütununda null dəyər not-null constraint-ni pozur
Necə qarşısını almaq olar?
- CSV faylında bütün vacib sütunlar üçün dəyər olduğuna əmin ol.
- Əgər boş dəyərlər icazəlidirsə,
NOT NULLconstraint-ni sil və ya default dəyər təyin et:
ALTER TABLE telebeler ALTER COLUMN email SET DEFAULT 'unknown@example.com';
Loglama səhvləri
Səhvlər barədə məlumatın olmaması
Böyük faylları yükləyəndə error-ları saxlamaq vacibdir. Təəssüf ki, COPY əmri default olaraq loglama mexanizmi vermir.
Necə qarşısını almaq olar? Error-ları ayrıca cədvəldə loglamaq üçün konfiqurasiya et. Məsələn, error-lar üçün ayrıca cədvəl yarat və səhv qeydləri ora yönləndir:
COPY telebeler FROM '/path/to/file.csv'
DELIMITER ','
CSV HEADER
LOG ERRORS INTO error_log
REJECT LIMIT 100;
Səhvlərin qarşısını almaq üçün xülasə
- Həmişə məlumatı yükləməzdən əvvəl analiz və yoxlama apar.
- Məlumatı əvvəlcədən işləmək üçün aralıq cədvəllərdən istifadə et.
- Error loglamanı aktiv et və onları analiz et.
- Konflikt və ya uyğunsuzluq olduqda
ON CONFLICTvə ya aralıq cədvələ yükləmə istifadə et. - Faylın encoding-ni yoxla və server parametrlərini düzəlt.
Kütləvi məlumat yükləmək çətin ola bilər, amma düzgün yanaşma ilə bu prosesi sürətli, etibarlı və effektiv edə bilərsən. Yeni bacarıqlarını yoxlamaq istəyirsən? Böyük bir CSV faylını test bazasına yüklə və bütün məlumatların düzgün yükləndiyinə əmin ol!
GO TO FULL VERSION