アスタリスクシステムからMySQLログデータベースに通話詳細レコードを埋め戻すスクリプトに取り組んでいます。以下のコードでは、重複するキーを無視して次の行に進んでいますが、このコードを実行すると、最初の行の重複警告だけが表示され、スクリプトが終了します(以下の例2)。それが失敗する原因となっている明らかなエラー?
私の貧弱なPythonのエチケットを許してください、私はその言語に非常に慣れていません。私の仮定では、パスが例外から発生する可能性がありますが、foreachループは存続しません。
編集/注:これは、forループの終了の問題を解決した後でも言及する価値があります:finally:
SQL接続を閉じるブロックがあったため、finally:
ブロックは接続を閉じた後に実行されていましたexcept: pass
。したがって、上記の例では、finally:
がまだプログラムを異常終了させていました。
#!/usr/bin/python -d
import csv
import sys
import MySQLdb as mdb
log="Master.csv"
try:
con = mdb.connect('1.2.3.4','abcd','efgh','ijkl')
cur = con.cursor()
#Inefficient way of getting row count.
rcount = csv.reader(open(log, 'rb'))
print "Number of rows in csv: %d" % (len(list(rcount)))
#OK, real csv processing now.
reader = csv.reader(open(log, 'rb'))
iter = 0
for row in reader:
print "Row: %d" % (++iter)
clid = row[0]
src = row[1]
dst = row[2]
dcontext = row[3]
channel = row[4]
dstchannel = row[5]
lastapp = row[6]
lastdata = row[7]
start = row[8]
end = row[10]
duration = row[11]
billsec = row[12]
disposition = row[13]
amaflags = row[14]
accountcode = row[15]
uniqueid = row[16]
insertstr= "INSERT INTO cdr_extended (duration,billsec,amaflags,start,end,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,disposition,accountcode,uniqueid) VALUES (%s,%s,0,'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s');" % (duration,billsec,start,end,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,disposition,accountcode,uniqueid)
cur.execute(insertstr)
con.commit()
except mdb.Error, e:
if e.args[0] == 1062:
print "Dupe key on uniqueid: %s" % (uniqueid)
pass
else:
print "Error %d: %s" % (e.args[0],e.args[1])
sys.exit(1)
finally:
if con:
con.close()
出力:
Number of rows in csv: 2696
Row: 0
Dupe key on uniqueid: 1342632723.8