Python双反斜杠问题

时间:2011-09-19 23:03:34

标签: python sql-server

我正在使用python脚本向属于另一个系统的sql server发送数十万个插入查询。

我的插页示例:

"INSERT INTO ImportData (ISBNORISSNORURL, FILENAME, PDFLOCATIONS, PROCESSED) VALUES('0442019521', 'pinto_1995_245_hires.pdf', 'I:\\Collect and Process Data\\Licensing Schemes Processing\\03 Data Preparation Original\\USQ\\September-October 2010\\pinto_1995_245_hires.pdf','0');"

文件路径字符串分配给全局:

PDFLOCATIONS = "I:\Collect and Process Data\Licensing Schemes Processing\03 Data Preparation Original\USQ\September-October 2010"

然后将其添加到由名称/值对组成的字典中,该字典与插入查询中的字段和值数据匹配。这些转换为数据字符串:

final_header_list = str(fields_value_list.keys()).replace("[","").replace("]","").replace("'","")

final_values_list = str(fields_value_list.values()).replace("[","").replace("]","").replace("'","")

然后将其添加到最终插入字符串中:

insert_query = 'INSERT INTO {0} ({1}) VALUES({2});'.format(TABLE,final_header_list,final_value_list)

以10000为一组发送到sql server。

双反斜杠作为双反斜杠传递到数据库,而不是神奇地转换为单个反斜杠。我显然不允许使用正斜杠作为替代方案。有什么替代方法可以在我的结尾获得所需的单反斜杠吗?或者SQL服务器实例的管理员是否必须在结束时进行更改?

非常感谢!

2 个答案:

答案 0 :(得分:1)

字符串不会将双反斜杠转换为单反斜杠的唯一原因是它是原始字符串 - 检查它是如何构建的。

修改

好的,现在您已发布实际代码 - 没有双反斜杠。问题发生在str(dict.keys())期间 - 它正在放入各种反斜杠。您需要另一种构建值字符串的方法。我将提到你应该将参数分别传递给SQL包装器,而不是作为一个字符串传递(你冒着SQL注入攻击的风险)。

这是在没有所有额外反斜杠的情况下构建字符串的方法:

final_values_list = ', '.join(fields_value_list.values)

答案 1 :(得分:1)

尝试更改

PDFLOCATIONS = "I:\Collect and Process Data\Licensing Schemes Processing\03 Data Preparation Original\USQ\September-October 2010"

PDFLOCATIONS = r"I:\Collect and Process Data\Licensing Schemes Processing\03 Data Preparation Original\USQ\September-October 2010"

(注意原始 - r - 指标)

编辑:再试一次

使用丑陋的野兽方法:

final_values_list = ', '.join(fields_value_list.values).replace(r"\\", "\\")

因此强制字符串没有双反斜杠。我当然会先尝试更换

insert_query = 'INSERT INTO {0} ({1}) VALUES({2});'.format(TABLE,final_header_list,final_value_list)

insert_query = 'INSERT INTO %s (%s) VALUES(%s);' % (TABLE,final_header_list,final_value_list)

只是为了完全确定不需要丑陋的方法。