2015-09-21 103 views
1

我正面臨着這樣的問題:使用python更新空mysql字段

我有很多cvs文件不是標準化格式。 這裏是一個例子:

"VarName";"TimeString";"VarValue";"Validity";"Time_ms" 
"Data_block_1_HC1_sec_voltage";"02.07.2015 14:16:56";3,740281;1;42187595088,2176 
"Data_block_1_TC1.1";"02.07.2015 14:17:56";1319,3;1;42187595782,6042 
"Data_block_1_TC1.2";"02.07.2015 14:17:56";1319,8;1;42187595782,6042 
"Data_block_1_TCF1.1";"02.07.2015 14:17:56";513,9;1;42187595782,6042 
"HC1_HC1_output";"02.07.2015 14:17:56";0;1;42187595782,6042 
"Data_block_1_HC1_sec_cur";"02.07.2015 14:17:56";1782,873;1;42187595782,6042 
"Data_block_1_HC1_power";"02.07.2015 14:17:56";6,68997;1;42187595782,6273 
"HC1_HC1_setpoint";"02.07.2015 14:17:56";1320;1;42187595782,6273 
"Data_block_1_HC1_sec_voltage";"02.07.2015 14:17:56";3,74994;1;42187595782,6273 
"Data_block_1_TC1.1";"02.07.2015 14:18:56";1319,3;1;42187596477,0023 
"Data_block_1_TC1.2";"02.07.2015 14:18:56";1320;1;42187596477,0023 
"Data_block_1_TCF1.1";"02.07.2015 14:18:56";514,2;1;42187596477,0023 
"HC1_HC1_output";"02.07.2015 14:18:56";0;1;42187596477,0023 
"Data_block_1_HC1_sec_cur";"02.07.2015 14:18:56";1779,488;1;42187596477,0023 
"Data_block_1_HC1_power";"02.07.2015 14:18:56";6,672971;1;42187596477,0255 
"HC1_HC1_setpoint";"02.07.2015 14:18:56";1320;1;42187596477,0255 

8個變量的確有相同的時間戳。

這是我的代碼,我用它來形成數據:

import csv 
from collections import defaultdict 
import os 

from glob import glob 
from datetime import datetime 
from sqlalchemy import create_engine 
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey 

i=1 
engine = create_engine('mysql+pymysql://[email protected]/test',echo=False) 
conn = engine.connect() 
metadata = MetaData(bind=engine) 
data_dir = '' 


sql_values_list = list() 


for file_name in glob(os.path.join(data_dir, 'HC10.csv')): 
    with open(file_name, 'rt') as f: 
     #data_file=open('HC10.csv','rU') 
     reader=csv.DictReader(f,delimiter=';', quotechar='"') 
     data=defaultdict(lambda:[None,None,None,None,None,None,None,None]) 
     fruit_to_index = defaultdict(lambda:None,{'Data_block_1_HC1_sec_voltage':0,'Data_block_1_TC1.1':1,'Data_block_1_TC1.2':2,'Data_block_1_TCF1.1':3,'HC1_HC1_output':4,'Data_block_1_HC1_sec_cur':5,'Data_block_1_HC1_power':6,'HC1_HC1_setpoint':7}) 
     for row in reader: 
      if fruit_to_index[row['VarName']] != None: 

       data[datetime.strptime(row['TimeString'], '%d.%m.%Y %H:%M:%S')][fruit_to_index[row['VarName']]] = float(row['VarValue'].replace(',', '.')) 
       i=i+1 
       if i==2: 
        for key, value in data.items(): 
         if value != 
         sql_values_list.append((key, value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7])) 
         i=3 
         print(sql_values_list) 
     f.close() 

數據輸出這個字典:

defaultdict(<function <lambda> at 0x038C26F0>, {datetime.datetime(2015, 8, 15, 15, 1, 33): [4.034867, 1324.1, 1325.0, 533.7, 0.0, 1922.136, 7.755563, 1325.0], datetime.datetime(2015, 8, 15, 15, 4, 33): [4.034867, 1324.1, 1325.0, 533.7, 0.0, 1930.6, 7.794376, 1325.0],.... 

這裏是我的問題:

由於一個時間戳和其變量可以在多個文件中(每個文件大約有12000行),並且有300多個文件我不想一次全部處理。它的記憶消耗,這不會幫我很多,因爲新的時間戳每分鐘附加到新的文件。爲了更好地理解這裏有一個例子:

想象我處理一個文件(CCA 12 000行),並輸出一個時間戳可以是這樣的:datetime.datetime(2015, 8, 15, 15, 1, 33): [4.034867, NULL, NULL, NULL, 0.0, 1922.136, NULL, 1325.0]

我想將它插入到MySQL。下一次我在不同的文件上運行腳本。我的輸出可以如下:

datetime.datetime(2015, 8, 15, 15, 1, 33): [NULL, 1324.1, 1325.0, 533.7, NULL, NULL, 7.755563, NULL],

音符,總是有8個變量爲一個時間戳所以不能是像每一個時刻存在兩種目前存在的價值。

更新後的結果應該是:

datetime.datetime(2015, 8, 15, 15, 1, 33): [4.034867, 1324.1, 1325.0, 533.7, 0.0, 1922.136, 7.755563, 1325.0], 

我需要更新定時間戳(PrimaryKey的單位爲dB),但只有那些爲NULL字段MySQL數據庫。因爲偶然更新,我會用NULL值重寫存儲的變量。

我知道這是一個sql語句ISNULL或​​3210。 但我必須在python中這樣做。我使用vesrion 3.4和pyMysql作爲sqlalchemy的連接器。我知道sqlalclhemy可以做更新,但沒有什麼是isnull。請幫忙,因爲這對我來說非常重要,我的Python知識非常低。也許可以有另一個解決方案如何做到不更新,但對我來說似乎很難。非常感謝您的幫助

+0

有我可能解決方案使用語句插入重複鍵更新,但我應該設置爲只寫入列哪個值不是null –

回答

0

我想我今天找到了解決方案。 這確實正是我需要的:

sql = "INSERT INTO `projections_sample` (`id`,`month`, `revenue`) VALUES (%s,%s, %s) ON DUPLICATE KEY UPDATE month=IF(VALUES(month)IS NULL,month,VALUES(month)),revenue=IF(VALUES(revenue)IS NULL,revenue,VALUES(revenue))" 

它採用pymysql,它僅更新NULL字段保留現有的記錄,因爲它們。但我不知道這個解決方案有多堅實,但這是我所需要的,所以對我來說非常重要