1

アスタリスクシステムから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
4

2 に答える 2

3

ループtry...except内にある例外を引き起こすコードの周りにのみブロックをラップします。for私は使用しませんMySQLdbが、次のようなものが機能するはずです:

            try:
                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)
                else:
                    print "Error %d: %s" % (e.args[0],e.args[1])
                    sys.exit(1)
于 2012-09-10T21:37:34.627 に答える
1

passPythonでは、他のプログラミング言語の空の中括弧の代わりに使用されます。

if x>0: pass

c's に等しい:if (x>0);またはif (x>0){}

continueforループを続行するために使用します。

于 2012-09-10T21:42:45.223 に答える