2017-04-26 60 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; 
相关问题