2017-04-26 63 views
0

上下文: 我有一個MySQL數據庫中有這樣的格式的表。每一行爲一天的股票價格和交易量數據更新數據到mysql如果行不存在使用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 

此表由與同一列和格式從多個* .txt文件導入數據創建的。 * .txt文件名與ticker列中的股票代碼名稱相同:即:import AAA.txt讓我獲得2行AAA數據。

所有這些* .txt文件都是由我國檢索股票價格的系統自動生成的。每天,在股市收盤後,根據新的一天的數據,.txt文件將會有一個新的行。

問:每天,我怎麼會更新每個TXT文件中的新行到數據庫中,我不希望加載的所有數據在mysql表在日常生活中的.txt文件,因爲它需要大量的時間,我只想加載新的行。

我應該如何編寫代碼來完成這個更新任務。

+0

cron作業每天運行該腳本與交叉:當你打開一個文件,而不是打開它,並開始從一開始,你可以打開它,並有文件指針從文件末尾偏移只讀最後一行? – Fallenreaper

+0

該解決方案不是非常有效,因爲不是每次加載最後一行。如果我不每天更新表格,也就是說我每隔3天更新一次數據,每隔5天更新一次數據,所以我必須每次更改代碼以加載正確的新行。無論如何忽略現有的行,只添加新的行 –

+0

假設txt文件是隻讀的,那麼在某處保存結束指針的位置,以便它可以拾取它離開的地方呢? – Fallenreaper

回答

0

(1)創建/使用空階段表,沒有prmary ...:

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

) 

(2)#這應該是非常快

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

(3)上的ID加入然後使用散列函數來消除所有未更改的行。以下可以做得更好,但總的來說,對數據庫使用批量加載時,當你有很多行時,速度會快很多,而這主要取決於數據庫如何在內部移動內容。它一次可以更有效地維護一次,而不是一次一次。

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; 
相關問題