如果使用Python不存在行,则将数据更新到mysql

时间:2017-04-26 17:42:55

标签: python mysql database import

上下文 我在mysql数据库中有一个表格,其格式如下。每行是一天股票价格和交易量数据

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文件名与股票代码栏中的股票代码名称相同:即:导入AAA.txt获取2行AAA数据。

所有这些* .txt文件都是由我国检索股票价格的系统自动生成的。每天股市收盘后,根据新一天的数据,.txt文件将有一个新行。

问题:每天,如何将每个txt文件中的新行更新到数据库中,我不想每天在mysql表中的.txt文件中加载所有数据,因为它需要很多时候,我只想加载新行。

我应该如何编写代码来执行此更新任务。

1 个答案:

答案 0 :(得分: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;