1

スクリプトで例外が発生した場合、クエリを使用してデータベースに保存しようとしています

try:

<-- Code raise Exception -->

except Exception ,e: #Not sure which exception will get thrown
   saveToDB({'error_info':exc_info()[1]}, id=1)

def saveToDB(exp, id):
    vals = ','.join(["%s='%s'" %(k,v) for k,v in exp.iteritems()])
    query = "update trace_redo_lines set %s where id=%s" % (vals , id)
    res = cr.execute(query)

仮定の例外を実行した後は

Traceback (most recent call last):
  File "auto.py", line 22, in Upload
    with open(self.log_path,'r') as out:
IOError: [Errno 2] No such file or directory: u'Z:\\Doc\\temp.txt'

デバッグ中に、cmdの例外出力が次のようになっていることがわかりました

IOError: [Errno 2] そのようなファイルまたはディレクトリはありません: u'Z:\\Doc\\temp.txt'

だから今、関数 saveToDB() でこの例外を渡していますが、クエリを保存しているときにエラーが発生します

*** ProgrammingError: ('42000', "[42000] [Microsoft][SQL Native Client][SQL Server]Incorrect syntax near '\\'. (102) (SQLE
cDirectW)")

そのため、安全にdbに入ることができるように、適切な形式で例外を作成することができません。

データベースを保存するために例外を簡単にフォーマットするための回避策はありますか。

ドライバー: pyodbc、python 2.6

ありがとうございます。

4

1 に答える 1

1

私はpyodbcドライバーに精通していませんが、提案をしたいと思いました...

クエリをパラメータ化するための適切なアプローチを使用して、ドライバが文字列をエスケープできるようにする必要があります。

query = "update trace_redo_lines set ? where id=?"
res = cr.execute(query, vals, id)

Pythonの文字列フォーマットは使用しないでください。それらをパラメータとしてドライバに渡します。pyodbcvalsをエスケープするかどうかはわかりませんが、試してみる価値はあります。

アップデート

文字列形式で多数のキーと値のペアを結合していることに気付きました。これを「key=?」を結合するものに置き換えてから、値を引数に追加してみてください。

keys = ', '.join(["%s=?" % k for k in exp.iterkeys()])
query = "update trace_redo_lines set %s where id=?" % keys
res = cr.execute(query, *exp.values(), id)

あなたはあなたの「key=?」を構築することになります キーごとに、一致する値をparamsとして渡し、その後にidを渡します。

于 2012-07-11T05:32:35.850 に答える