2017-09-18 2 views
0

私は 'testfolder'という2つのファイル - 'Sigurdlogfile'と '2004ADlogfile'を含むフォルダを持っています。各ファイルにはentriesという文字列のリストがあります。私は両方のコードを実行する必要があり、これを行うにはglobを使用しています。私のコードは、各ファイルの辞書を作成し、辞書キーが格納されている正規表現を使用して抽出されたデータを、下のcommontermsに格納します。次に、各辞書をmysqlテーブルに挿入します。これはうまくいっていますが、私の2番目の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() 

問題は、2番目のSQL文で、それはobjkey秒の一つだけからのテーブルのすべての列にデータが、私はどのファイルに応じて、異なるデータを挿入することが必要であることを挿入して終わるということですコードは現在実行中です。私はfor filename in filesのループの中にobjkeyを定義しているので、なぜこのことが分かりません。これをどうすれば解決できますか?

+0

2番目のクエリは '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

ありがとうございました上書きのしかし、私は今何か他のものに取り組んでいます - 時には特定のファイルは古いテーブルの中にデータを持っていません(したがって、 'select * from oldtable where' obj = 'some object' 'というコマンドを実行すると、 )。そして、この場合、それをスキップして、辞書からでもデータのいずれにも入力しません。しかし、私はまだどのように他のデータを挿入し、それらのkey1とkey2フィールドだけを 'NULL'として保持するのでしょうか? –

+0

「LEFT JOIN」でこれを行う方法を示すために答えを更新しました。 – Barmar

関連する問題