CodeGym /Kursy /SQL SELF /Typowe błędy przy masowym ładowaniu danych

Typowe błędy przy masowym ładowaniu danych

SQL SELF
Poziom 24 , Lekcja 4
Dostępny

Masowe ładowanie danych do PostgreSQL to trochę jak gra w tetris: wszystkie klocki (dane) muszą idealnie pasować do istniejącej tabeli (struktury bazy danych). Ale jak w grach, często pojawiają się błędy, które mogą spowolnić proces albo nawet go całkiem rozwalić. Możesz natknąć się na problemy z niezgodnością typów danych, kodowaniem, duplikatami rekordów, a czasem nawet na niespodziewane błędy z uprawnieniami.

Jakie dokładnie błędy się zdarzają, jak je diagnozować i jak im zapobiegać? Dzisiaj rozłożymy na czynniki pierwsze najczęstsze problemy, żebyś został prawdziwym mistrzem masowego ładowania danych.

Błędy niezgodności struktury danych

Problemy z typami danych

Bardzo często podczas ładowania danych możesz zobaczyć taki błąd:

ERROR:  invalid input syntax for type integer: "abc"
CONTEXT:  COPY students, line 3, column age: "abc"

To się dzieje, jeśli dane w twoim pliku CSV nie odpowiadają oczekiwanemu typowi kolumny. Na przykład, jeśli w kolumnie age spodziewasz się liczby, a w danych pojawia się tekst "abc". PostgreSQL nie wie, jak zamienić tekst na liczbę i proces ładowania się zatrzymuje.

Jak tego uniknąć?

  1. Sprawdź swój plik CSV przed ładowaniem. Jeśli pracujesz w Excelu albo Pythonie, upewnij się, że wszystkie kolumny mają odpowiednie typy.
  2. Jeśli mimo wszystko pojawiają się błędy, możesz spróbować najpierw załadować dane do tymczasowej tabeli, gdzie wszystkie kolumny są typu TEXT, a potem zrobić konwersję:
UPDATE temp_students
SET age = CAST(age AS INTEGER)
WHERE age ~ '^\d+$';

Brakujące kolumny

Jeśli struktura tabeli nie zgadza się z danymi z pliku CSV, PostgreSQL wywali błąd. Na przykład:

ERROR:  missing data for column "email"
CONTEXT:  COPY students, line 2: "John,Doe,21"

To zwykle się zdarza, jeśli nagłówki (albo kolejność kolumn) w pliku CSV różnią się od struktury tabeli.

Jak tego uniknąć? Używając komendy COPY zawsze podawaj listę kolumn, które chcesz wypełnić:

COPY students (first_name, last_name, age)
FROM '/path/to/file.csv' 
DELIMITER ',' 
CSV HEADER;

Błędy kodowania

Problemy z różnymi kodowaniami

Jeśli twój plik CSV został zapisany w innym kodowaniu niż UTF-8 (np. Windows-1251), PostgreSQL może nie rozpoznać pliku. To powoduje błędy, szczególnie jeśli w danych są znaki cyrylicy:

ERROR:  invalid byte sequence for encoding "UTF8": 0xd0
CONTEXT:  COPY students, line 1

Jak tego uniknąć?

  1. Upewnij się, że twój plik CSV jest zapisany w UTF-8.
  2. Jeśli to niemożliwe, podaj kodowanie pliku podczas ładowania:
COPY students FROM '/path/to/file.csv'
DELIMITER ',' 
CSV HEADER 
ENCODING 'WIN1251';

Błędy dostępu do pliku

Problemy z uprawnieniami dostępu

Jeśli używasz komendy COPY, PostgreSQL musi mieć dostęp do pliku, który ładujesz. Jeśli plik jest niedostępny, zobaczysz taki błąd:

ERROR:  could not open file "/path/to/file.csv" for reading: Permission denied

Albo nawet:

ERROR:  no such file or directory

Jak tego uniknąć?

  1. Upewnij się, że PostgreSQL ma dostęp do pliku. Na Linuksie może to być kwestia uprawnień. Użyj komendy chmod, żeby nadać dostęp:
    chmod 644 /path/to/file.csv
    
  2. Jeśli pracujesz z lokalnego kompa, użyj komendy \COPY zamiast COPY.

Problemy z duplikatami danych

Podczas ładowania danych do tabel z ograniczeniem UNIQUE (np. unikalnymi identyfikatorami) możesz natknąć się na konflikty:

ERROR:  duplicate key value violates unique constraint "students_pkey"
DETAIL:  Key (id)=(1) already exists.

To się dzieje, jeśli w pliku CSV są powtarzające się rekordy albo dane już istnieją w tabeli.

Jak tego uniknąć?

  1. Użyj opcji ON CONFLICT, żeby obsłużyć duplikaty:
    INSERT INTO students (id, first_name, last_name)
    VALUES (1, 'John', 'Doe')
    ON CONFLICT (id) DO NOTHING;
    
  1. Jeśli używasz COPY albo \COPY, tymczasowo ładuj dane do tabeli pośredniej, a potem wrzucaj je do głównej z obsługą duplikatów.

Błędy pustych wartości

W PostgreSQL kolumny z ograniczeniem NOT NULL nie pozwalają na puste wartości. Jeśli w twoim pliku CSV są puste kolumny, możesz zobaczyć taki błąd:

ERROR:  null value in column "email" violates not-null constraint

Jak tego uniknąć?

  1. Upewnij się, że plik CSV zawiera wartości dla wszystkich wymaganych kolumn.
  2. Jeśli puste wartości są ok, usuń ograniczenie NOT NULL albo ustaw wartość domyślną:
ALTER TABLE students ALTER COLUMN email SET DEFAULT 'unknown@example.com';

Błędy w logowaniu

Brak informacji o błędach

Jeśli ładujesz duże pliki, ważne jest, żeby zapisywać info o błędach. Niestety, komenda COPY domyślnie nie daje mechanizmów do logowania.

Jak tego uniknąć? Skonfiguruj logowanie błędów przez osobną tabelę. Na przykład, stwórz tabelę na błędy i przekieruj tam nieprawidłowe rekordy:

COPY students FROM '/path/to/file.csv'
DELIMITER ',' 
CSV HEADER
LOG ERRORS INTO error_log
REJECT LIMIT 100;

Podsumowanie jak unikać błędów

  1. Zawsze analizuj i sprawdzaj dane przed ładowaniem.
  2. Używaj tymczasowych tabel do wstępnej obróbki danych.
  3. Włącz logowanie błędów i analizuj je.
  4. W przypadku konfliktów lub niezgodności używaj ON CONFLICT albo ładowania do tabel pośrednich.
  5. Sprawdź kodowanie plików i ustawienia serwera.

Masowe ładowanie danych może być trudne, ale z dobrym podejściem możesz zrobić to szybko, pewnie i skutecznie. Chcesz sprawdzić nowe skille? Spróbuj załadować duży plik CSV do testowej bazy i upewnij się, że wszystkie dane weszły jak trzeba!

1
Ankieta/quiz
Optymalizacja masowego ładowania, poziom 24, lekcja 4
Niedostępny
Optymalizacja masowego ładowania
Optymalizacja masowego ładowania
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION