在我的脚本中,如果出现任何异常,我试图使用查询
保存到数据库中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
感谢所有人。
答案 0 :(得分: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 =?”对于每个键,然后传递值以匹配为params,然后是id。