PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : postgreSQL in conflict



Huhn Hur Tu
18.08.17, 09:00
Hi,

keine Linux Frage, aber bla bla jarre jarre sry;)

Ich will die Datensaetze dreier PostgreDBs abgleichen.

Konkret geht es um Grafana DB Instanzen und deren Datasources und Dashboards
Die DS und Dashboards in der Liveinstanz sollen allen auch in QA und DEV verfuegbar sein.

Hierfuer gibt es zwei Tabellen

- datasource
- dashboards

Ich will nun in python die Daten in Live auslesen und Line per Line pruefen sind diese schon vorhanden, wenn nein mache ein insert und wenn ja mache ein update auf die Felder die sich unterscheiden. Alternativ koennte ich auch ein "on conflict do update" oder spaeter mit Postgre 9.5 "upsert" machen.



INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;


Ich haette bei der "on conflict" Variante jedoch immer ein update auf allen Tabellen.

Mein Frage also, faellt euch etwas in SQL einwas weniger update Operationen hat wenn der Datensatz schon vorhanden ist.
Ich streube mich etwas, das ganze in Pruefiterationen in python zu machen, da das etwas haesslich ist und bei Schemaaenderungen nur Aerger bringt

Hintergrund des ganzen. Ich habe in den einzelnen Umgebungen je zwei Toolmaschinen u.A. mit Grafana drauf.
in DEV und QA soll mit den Technologien rumgespielt werden und in dann in allen Stages identisch zur Verfuegung stehen, Test und Spiel Dashboards und Datasources sollen erhalten bleiben, deswegen kommt ein "dump restore" nicht in Frage.

Gruss Stefan

marce
18.08.17, 09:19
https://www.google.de/search?q=postgres+merge+tables liefert evtl. einige Ideen.

Ggf. würde ich mir mal https://www.postgresql.org/message-id/attachment/23520/sql-merge.html anschauen.

Welche PostGreSQL-Version hast Du denn in Verwendung? Ggf. gibt es auch eine Variante über einen ded. Datenexport + Import über die verwendete Frontend-Software. Alternativ ein "brauchbares" Export-Format auswählen und dann die Exporte mergen und wieder importieren.

Huhn Hur Tu
25.08.17, 11:22
Hm.. merge war eine gute Idee, aber erst nach 9.4.5 verfuegbar, die hab ich nicht, heul. upsert erst ab 9.5.

Ich habe nur PG 9.4.4 zur Verfuegung.

Ich kann aus der Live exportieren und in eine temporaere Tabelle importieren, dann fehlt noch der merge.

Irgendwie vermisse ich hier ein "for each row update table1 set fuu, fuuu, fuuuu (select fuu, fuuu, fuuuu from table2)"

nopes
25.08.17, 11:36
Hab da jetzt nicht lange drüber nach gedacht, aber temp Tables können doch auch trigger, so könntest du dir relativ einfach dein foreach basteln, sollte dann aber wirklich nur eine temporäre Lösung sein, weil performant ist das nicht wirklich.

Huhn Hur Tu
29.08.17, 10:50
Es geht hier um max 100 Eintraege, also Datasources und spaeter die Dashboards von Grafana