2017-09-18 7 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들 중 하나에서 테이블의 모든 컬럼에 데이터를 삽입 끝나는 것입니다,하지만 난 그게에 따라 서로 다른 데이터를 삽입 할 파일이 필요 코드가 현재 실행 중입니다. 내 for filename in files 루프 안에 objkey을 정의했기 때문에이 이유가 무엇인지 파악할 수 없습니다. 이 문제를 어떻게 해결할 수 있습니까?

+0

두 번째 쿼리는'table'과'oldtable '사이의 관계가 없으므로 완전한 교차 제품을 수행하고 있습니다. – Barmar

+0

문자열 대체 대신 준비된 명령문을 수행하는 방법을 배워야합니다. – Barmar

+0

@Barmar 당신은 어떻게 의미합니까? 이전 테이블에서 'Sigurdlogfile'에 대한 올바른 데이터를 삽입하고 있지만 문제는 Sigurd 데이터를 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

문제를 해결해 주셔서 감사합니다. 덮어 쓰기 중. 그러나 나는 지금 다른 뭔가를 실행 중입니다 - 때로는 특정 파일에 이전 테이블에있는 모든 데이터가 없습니다 (그래서 내가 명령을 실행 'oldtable에서 * 선택 obj ='일부 개체 '', 그것은 빈 집합을 반환합니다). 그리고이 경우에는 건너 뛴다. 그리고 어떤 데이터에도 입력하지 않는다. 그러나 나는 어떻게 다른 데이터를 삽입 할 것인가? 그리고 key1과 key2 필드는 'NULL'로 유지 될 것인가? –

+0

'LEFT JOIN'으로이를 수행하는 방법을 보여주기 위해 답변을 업데이트했습니다. – Barmar