我需要将字符串的动态列表传递到原始sql查询中。这是我的代码:
myList = ['PREFIX\000\000923', 'PREFIX\000\000CS3'] # <- strings I have troubles with
myList = ['OK1', 'OK2'] # <- ok strings
myTuple = tuple(myList)
query = "SELECT * FROM public.items WHERE name IN {}".format(myTuple)
result = cursor.execute(query, myTuple)
rows = dict_fetch_all(cursor)
for row in rows:
print(row)
上面的代码可以正常工作。但是,带有特殊字符且带有反斜杠的字符串存在这样的问题:"PREFIX\000\000923".
正确的编码方式是什么?
[编辑] 这是控制台中的打印查询:
SELECT * FROM public.items WHERE name IN ('PREFIX\x00\x00923', 'PREFIX\x00\x00CS3')
如您所见,myList项目已转换为一些奇怪的字符串。
答案 0 :(得分:-1)
反斜杠是python中的特殊字符。
在您的情况下,在最后一个字符串中加上一个反斜杠,然后再加上其他任何字符,就意味着另外一个字符。
为了确保您的最终字符串包含反斜杠而不包含任何奇怪的字符,您需要按如下所示放置两个连续的反斜杠符号。
这将完全满足您的要求。您可以了解有关此here的更多信息。
还要消除关于最终字符串中的dobule反斜杠的困惑,这只是视觉上的误解,如您在下面看到的那样,使用两个反斜杠不会导致最终字符串中出现两个反斜杠。
上面代码中的第二个错误是使用tuple函数,该函数返回一个tuple对象,而不是列表的字符串括起来的形式。 以下代码应该适合您。
def customTuple(arr):
arr = ["'"+item+"'" for item in arr]
s = '('+','.join(arr)+')'
return s
myList = ['PREFIX\\000\\000923', 'PREFIX\\000\\000CS3'] # <- strings I have troubles with
myTuple = customTuple(myList)
query = "SELECT * FROM public.items WHERE name IN {}".format(myTuple)
print(query)