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)

执行假设 exeption 后是

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)")

所以我无法以正确的格式制作异常,以便它可以安全地进入数据库。

他们是否有任何解决方法可以轻松格式化异常以保存数据库。

驱动程序:pyodbc,python 2.6

谢谢大家。

4

1 回答 1

1

我对pyodbc司机不熟悉,但我想提供一个建议......

您应该尝试使用正确的方法来参数化您的查询,并让驱动程序可能会转义您的字符串:

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

不要使用 python 字符串格式。将它们作为参数传递给驱动程序。我不知道是否pyodbc逃脱了 vals 但值得一试。

更新

我意识到您在字符串格式中加入了一堆键/值对。您可以尝试将其替换为加入“key=?”的内容,然后将值添加到 args:

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=?” 对于每个键,然后将要匹配的值作为参数传递,然后是 id。

于 2012-07-11T05:32:35.850 回答