2017-09-18 209 views
0

我有一個名爲'testfolder'的文件夾,其中包含兩個文件'Sigurdlogfile'和'2004ADlogfile'。每個文件都有一個名爲entries的字符串列表。我需要在兩者上運行我的代碼,並使用glob來執行此操作。我的代碼爲每個文件創建一個字典,並存儲使用正則表達式提取的數據,其中字典密鑰存儲在下面的commonterms中。然後它將每個字典插入到一個mysql表中。它成功地完成了所有這些,但是我的第二個sql語句沒有插入它應該如何(每個文件)。循環不適用於SQL更新語句(mysqldb)

import glob 
import re 
files = glob.glob('/home/user/testfolder/*logfile*') 

commonterms = (["freq", "\s?(\d+e?\d*)\s?"], 
       ["tx", "#txpattern"], 
       ["rx", "#rxpattern"], ...) 

terms = [commonterms[i][0] for i in range(len(commonterms))] 
patterns = [commonterms[i][1] for i in range(len(commonterms))] 

def getTerms(entry): 
    for i in range(len(terms)): 
     term = re.search(patterns[i], entry) 
     if term: 
      term = term.groups()[0] if term.groups()[0] is not None else term.groups()[1] 
     else: 
      term = 'NULL' 
     d[terms[i]] += [term] 
    return d 

for filename in files: 
    #code to create 'entries' 
    objkey = re.match(r'/home/user/testfolder/(.+?)logfile', filename).group(1) 

    d = {t: [] for t in terms} 

    for entry in entries: 
     d = getTerms(entry) 

    import MySQLdb 
    db = MySQLdb.connect(host='', user='', passwd='', db='') 
    cursor = db.cursor() 
    cols = d.keys() 
    vals = d.values() 

    for i in range(len(entries)): 
     lst = [item[i] for item in vals] 
     csv = "'{}'".format("','".join(lst)) 
     sql1 = "INSERT INTO table (%s) VALUES (%s);" % (','.join(cols), csv.replace("'NULL'", "NULL")) 
     cursor.execute(sql1) 

#now in my 2nd sql statement I need to update the table with data from an old table, which is where I have the problem... 

    sql2 = "UPDATE table, oldtable SET table.key1 = oldtable.key1, 
table.key2 = oldtable.key2 WHERE oldtable.obj = %s;" % repr(objkey) 
    cursor.execute(sql2) 

    db.commit() 
    db.close() 

的問題是,在第二個SQL語句,它最終只從objkey S的一個插入數據到表中的所有列,但我需要它,這取決於插入不同的數據文件代碼當前正在運行。我無法弄清楚爲什麼這是因爲我已經在我的for filename in files循環內定義了objkey。我怎樣才能解決這個問題?

+0

你的第二個查詢在'table'和'oldtable'之間沒有任何關係,所以它做了一個完整的交叉產品。 – Barmar

+0

你應該學會做準備的陳述,而不是做字符串替換。 – Barmar

+0

@Barmar你是什麼意思?它從舊錶中爲'Sigurdlogfile'插入正確的數據,但問題在於它也會從2004AD –

回答

1

而不是單獨INSERTUPDATE,做他們一起合併來自舊錶的字段。

for i in range(len(entries)): 
    lst = [item[i] for item in vals] 
    csv = "'{}'".format("','".join(lst)) 
    sql1 = """INSERT INTO table (key1, key2, %s) 
      SELECT o.key1, o.key2, a.* 
      FROM (SELECT %s) AS a 
      LEFT JOIN oldtable AS o ON o.obj = %s""" % (','.join(cols), csv.replace("'NULL'", "NULL"), repr(objkey)) 
    cursor.execute(sql1) 
+0

謝謝你解決了這個問題的覆蓋。但是我現在正在運行其他的東西 - 有時一個特定的文件在舊錶中沒有任何數據(所以如果我運行命令'select * from oldtable where obj ='some object'',它會返回一個空集)。在這種情況下,它會跳過它,不會輸入任何數據,即使是從字典中輸入。但是,我仍然會如何獲取要插入的其他數據,並將那些key1和key2字段保留爲「NULL」? –

+0

我已經更新了答案,以說明如何使用'LEFT JOIN'來做到這一點。 – Barmar