'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
을 정의했기 때문에이 이유가 무엇인지 파악할 수 없습니다. 이 문제를 어떻게 해결할 수 있습니까?
두 번째 쿼리는'table'과'oldtable '사이의 관계가 없으므로 완전한 교차 제품을 수행하고 있습니다. – Barmar
문자열 대체 대신 준비된 명령문을 수행하는 방법을 배워야합니다. – Barmar
@Barmar 당신은 어떻게 의미합니까? 이전 테이블에서 'Sigurdlogfile'에 대한 올바른 데이터를 삽입하고 있지만 문제는 Sigurd 데이터를 2004AD에서 삽입해야하는 위치에 삽입하는 것입니다. –