Jak sprawdzić, czy rekord zmienił się w Postgres

Mam pytanie typu „upsert” ... ale chcę to wyrzucić, ponieważ jest trochę inne niż te, które przeczytałem na temat stackoverflow.

Podstawowy problem.

Pracuję nad przejściem z mysql do PostgreSQL 9.1.5 (hostowanego na Heroku). Jako część tego muszę codziennie importować wiele plików CSV. Niektóre dane są informacjami o sprzedaży i prawie na pewno są nowe i wymagają wstawienia. Ale inne części danych prawie na pewno będą takie same. Na przykład pliki csv (liczba mnoga) będą zawierały informacje o punktach sprzedaży (POS). Rzadko się to zmienia (a najprawdopodobniej tylko poprzez dodatki). Następnie są informacje o produkcie. Istnieje około 10 000 produktów (zdecydowana większość pozostanie niezmieniona, ale możliwe jest zarówno dodawanie, jak i aktualizacje).

Ostatnim elementem (ale jest ważny) jest to, że mam wymóg, aby móc dostarczyć ścieżkę audytu / informacje dla dowolnego przedmiotu. Na przykład, jeśli dodam nowy rekord POS, muszę być w stanie prześledzić go z powrotem do pliku, w którym został znaleziony. Jeśli zmienię kod UPC lub opis produktu, muszę mieć możliwość śledzenia go z powrotem do importu (i pliku), skąd pochodzi zmiana.

Rozwiązanie, które rozważam.

Ponieważ dane są dostarczane do mnie przez CSV, pracuję nad ideą, że COPY będzie najlepszym / najszybszym sposobem. Struktura danych w plikach nie jest dokładnie tym, co mam w bazie danych (tj. Miejscu docelowym). Dlatego kopiuję je do tabel w schemacie przemieszczania, które pasują do CSV (uwaga: jeden schemat na źródło danych). Tabele w schematach przemieszczania będą miały wyzwalacze wierszy poprzedzające wstawienie. Te wyzwalacze mogą zdecydować, co zrobić z danymi (wstawić, zaktualizować lub zignorować).

W przypadku tabel, które najprawdopodobniej zawierają nowe dane, spróbuje wstawić je jako pierwsze. Jeśli rekord już istnieje, zwróci wartość NULL (i zatrzyma wstawianie w tabeli pomostowej). W przypadku tabel, które rzadko się zmieniają, wysyła zapytanie do tabeli i sprawdza, czy rekord został znaleziony. Jeśli tak, potrzebuję sposobu, aby sprawdzić, czy któreś z pól zostało zmienione. (ponieważ pamiętaj, muszę pokazać, że rekord został zmodyfikowany przez import x z pliku y). Oczywiście mogę po prostu wyodrębnić kod i przetestować każdą kolumnę. Ale szukał czegoś bardziej „elokwentnego” i łatwiejszego do utrzymania niż to.

W pewnym sensie łączę system importowania z systemem śledzenia zdarzeń. Tak więc, badając ścieżki audytu, przejrzałem następującewiki.postgresql.org artykuł. Wygląda na to, że hstore może być dobrym sposobem na uzyskanie zmian (i możliwość łatwego ignorowania niektórych kolumn w tabeli, które nie są ważne - np. „Last_modified”)

Mam około 90% pewności, że to wszystko zadziała ... Stworzyłem kilka tabel testowych itp. I bawiłem się nimi.

Moje pytanie?

Jest to lepszy, łatwiejszy w utrzymaniu sposób wykonania tego zadania polegający na znalezieniu może 3 rekordów na 10 KB, które wymagają zmiany w bazie danych. Z pewnością mógłbym napisać skrypt Pythona (lub coś innego), który czyta plik i próbuje dowiedzieć się, co zrobić z każdym rekordem, ale wydaje się to okropnie nieefektywne i doprowadzi do wielu podróży w obie strony.

Kilka ostatnich rzeczy:

Nie mam kontroli nad plikami wejściowymi. Uwielbiałbym to, gdyby wysłali mi tylko delty, ale nie robią tego, i jest to całkowicie poza moją kontrolą lub wpływem.system się rozwija, a nowe źródła danych prawdopodobnie zostaną dodane, co znacznie zwiększy ilość przetwarzanych danych (dlatego staram się, aby wszystko działało sprawnie)Wiem, że to nie jest miłe, proste pytanie SO (jak „jak sortować listę w pythonie”), ale wierzę, że jedną z największych zalet SO jest to, że możesz zadawać trudne pytania, a ludzie będą dzielić się swoimi przemyśleniami na temat tego, jak myślą najlepszym sposobem rozwiązania tego jest.

questionAnswers(1)

yourAnswerToTheQuestion