2017-04-26 8 views
0

Kontext: Ich habe eine Tabelle in MySQL-Datenbank, die das Format wie folgt hat. Jede Zeile ist ein Tag Aktienkurs und VolumendatenDaten zu mysql aktualisieren, wenn Zeile nicht existiert mit Python

Ticker,Date/Time,Open,High,Low,Close,Volume 
AAA,7/15/2010,19.581,20.347,18.429,18.698,174100 
AAA,7/16/2010,19.002,19.002,17.855,17.855,109200 
BBB,7/19/2010,19.002,19.002,17.777,17.777,104900 
BBB,7/19/2010,19.002,19.002,17.777,17.777,104900 
CCC,7/19/2010,19.002,19.002,17.777,17.777,104900 
....100000 rows 

Diese Tabelle durch den Import der Daten aus mehreren * .txt-Datei mit der gleichen Spalte und Format erstellt wird. Der Name der * .txt-Datei ist identisch mit dem Tickernamen in der Tickerspalte: zB: import AAA.txt erhält die 2 Zeilen AAA-Daten.

All diese * .txt-Datei wird automatisch von einem System generiert, das den Aktienkurs in meinem Land abruft. Jeden Tag, nach dem Börsenschluss, wird die .txt-Datei eine neue Zeile entsprechend den Daten des neuen Tages haben.

Frage: jeden Tag, wie kann ich die neue Zeile in jeder txt-Datei in die Datenbank aktualisieren, ich möchte nicht alle Daten in der TXT-Datei in MySQL-Tabelle jeden Tag geladen werden, da es eine Menge Zeit in Anspruch nehmen Ich möchte nur neue Zeilen laden.

Wie sollte ich den Code schreiben, um diese Aktualisierung Mission zu tun.

+0

Cron-Job das Skript täglich gekreuzt mit auszuführen: wenn Sie eine Datei öffnen, anstatt sie zu öffnen und startete von Anfang an, könnte man es öffnen und hat die Dateizeiger vom Ende der Datei versetzt werden nur die letzte Zeile lesen? – Fallenreaper

+0

Diese Lösung ist nicht sehr effektiv, da nicht immer die letzte Zeile geladen wird. Wenn ich die Tabelle nicht täglich aktualisiere, dh einige Zeit aktualisiere ich die Daten alle 3 Tage, einige Zeit alle 5 Tage, so muss ich den Code jedes Mal ändern, um die korrekte neue Zeile zu laden. Gibt es sowieso die bestehende Zeile zu ignorieren und nur neue Zeilen anzuhängen –

+0

unter der Annahme, dass die TXT-Dateien nur gelesen werden, was ist mit dem Speichern der End-Zeiger-Stelle irgendwo, so dass es dort aufnehmen kann, wo es aufgehört hat? – Fallenreaper

Antwort

0

(1) Erstellen/eine leere Bühne Tabelle verwenden, keine prmary ...:

create table db.temporary_stage (
    ... same columns as your orginial table , but no constraints or keys or an index .... 

) 

(2) # sollte dies wirklich

schnell auf id
LOAD DATA INFILE 'data.txt' INTO TABLE db.temporary_stage; 

(3) verbinden Verwenden Sie dann eine Hash-Funktion, um alle Zeilen zu entfernen, die sich nicht geändert haben. Das Folgende kann verbessert werden, aber alles in allem mit Massenlasten gegen Datenbanken ist viel schneller, wenn Sie viele Zeilen haben, und das ist meist darauf zurückzuführen, wie die Datenbank Dinge intern bewegt. es kann viel effizienter auf einmal als ein wenig nach dem anderen aufrechterhalten.

UPDATE mytable SET 
      mytable... = temporary_stage... 
      precomputed_hash = hash(concat(....)) 
    FROM 
    ( 
      SELECT temporary_stage.* from mytable join 
       temporary_stage on mytable.id = temporary_state.id 
       where mytable.pre_computed_hash != hash(concat(....))) 
    AS new_data on mytable.id = new_data.id 

# clean up 

DELETE FROM temporary_stage; 
Verwandte Themen