2017-07-13 4 views
0

Problem: Satz von Tabellen, die in eine Postgres-Datenbank analysiert werden müssen. Das Einfügen ist geradeaus. Was aber, wenn sich die Daten in der Tabelle ändern?PostgreSQL: Kombinieren löschen und aktualisieren

So liest ein Python3-Skript das Tabellenblatt, das eine Mischung aus Variablen (sheet1) und rohen Zeitreihen (sheet2) ist. Spreadsheets sind flexibel für die Datenerfassung, deshalb.

Allerdings stolpere ich mit wechselnden Daten in der Tabellenkalkulation. Ich benutze postgresql 9.6, und ich weiß, wie UPSERT zu tun.

Eine der Tabellen sieht so aus: | ID | key_to_other_table | Parameter | Wert |

UPSERT funktioniert perfekt, wenn der key_to_other_table und Parameter in der Tabelle ist oder nicht.

Das Problem liegt vor, wenn ein Parameter ursprünglich in der Tabelle enthalten war und in die Datenbank hochgeladen wurde, aber in der Tabelle korrigiert wurde, aber immer noch in der Datenbank vorhanden ist.

Ich brauche eine Art löschen zu tun, aber ich mag nicht ein stumpfes löscht alle Zeilen tun und dann einfach wieder einsetzen, wie ich die ID verwenden ...

Ich würde jetzt ein tun hole, lade alle IDs der Zeile, die mit einer bestimmten Tabelle verknüpft sind, führe eine Auffüllung der Werte durch und erhalte die ID davon.

Vergleichen Sie die beiden Listen und löschen Sie dann diejenigen, die nicht mehr benötigt werden. Aber das scheint wie drei verschiedene Datenbankabfragen ... Gibt es eine elegante Möglichkeit, dies in einem einzigen Schritt zu tun?

+0

Was ist Ihr einzigartiger Schlüssel für diese Arbeit upsert? –

+0

Das klingt nach einer großen Sauerei für mich. Ich würde Sie davon abraten, mit Spreadsheets zu arbeiten, wenn Sie Anforderungen an eine genaue/präzise Kontrolle Ihrer Daten haben. Postgres ist ein guter Ort, um Ihre Daten zu speichern. –

+0

Jeder andere Vorschlag ist willkommen, aber die Arbeit mit Tabellen ist ein Kompromiss zwischen der Benutzerfreundlichkeit für die Operatoren und der Datenstruktur, die ich möchte. Die Tabelle ist strukturiert und basiert auf einer Vorlage. – Ilpepe4

Antwort

0

Wenn Sie die Tabelle mit einer Art "Lade-ID" erweitern und diese mit dem UPSERT auffüllen, können Sie alle Datensätze aus der Tabelle löschen, die nicht die von Ihnen erwartete Lade-ID haben.

Allgemeiner Fluss:

  1. ThisLoadIdentifier: = aktuelle Zeitstempel
  2. Upsert die Zeilen aus der Tabelle, setzt load_identifier = ThisLoadIdentifier
  3. aus der Tabelle löschen, wo load_identifier = ThisLoadIdentifier

Probe! Exemplarische Vorgehensweise:

Ersteinrichtung.

Erweitern Sie Ihre Tabelle, um load_id vom Typ varchar Spalte hinzuzufügen.

ALTER TABLE myTable ADD load_id VARCHAR;

| id | key_to_other_table | parameter | value | load_id |

aktualisieren alle vorhandenen Zeilen einen Anfangswert haben.

`UPDATE myTable SET load_id = 'Existing Records';` 

Laden

  1. Ändern Sie Ihre Python-Skript, so dass, bevor es die Last beginnt zu tun, es kommt mit einem einzigartigen load_id auf. So etwas wie die aktuelle Uhrzeit usw.

    this_load_id = time.ctime()

  2. In Ihrem Einsatz/Upsert bevölkert die load_id Spalt mit Ihrem neuen this_load_id Wert.

  3. Sobald die Ladung abgeschlossen ist. Jede Zeile, die Sie eingefügt oder aktualisiert haben, hat die load_id = this_load_id. Jede Zeile, in der load_id diesen Wert nicht aufweist, stammt von einer älteren Auslastung und war nicht in dieser Kalkulationstabelle. Sie können dann mit einem einfachen sie loszuwerden

    löschen

    delete from myTable where load_id != this_load_id

Caveat: Sie würden wahrscheinlich etwas effizienter als ein Zeit/Datum-String in der Produktion verwendet werden soll.

+0

auch, mein Gehirn ist gerade aufgetaucht. Hättest du ein Beispiel oder Web Tutorial/Beispiel? Ich folge komplett – Ilpepe4

+0

@ llpepe4 Ich habe weitere Details hinzugefügt. – Gary

+0

danke! Ich gebe das eine Chance! – Ilpepe4

Verwandte Themen