将字符串列表传递到原始SQL查询中(Python / Django)

时间:2019-09-20 12:00:58

标签: python sql django postgresql

我需要将字符串的动态列表传递到原始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项目已转换为一些奇怪的字符串。

1 个答案:

答案 0 :(得分:-1)

反斜杠是python中的特殊字符。

在您的情况下,在最后一个字符串中加上一个反斜杠,然后再加上其他任何字符,就意味着另外一个字符。

enter image description here

为了确保您的最终字符串包含反斜杠而不包含任何奇怪的字符,您需要按如下所示放置两个连续的反斜杠符号。

enter image description here

这将完全满足您的要求。您可以了解有关此here的更多信息。

还要消除关于最终字符串中的dobule反斜杠的困惑,这只是视觉上的误解,如您在下面看到的那样,使用两个反斜杠不会导致最终字符串中出现两个反斜杠。

enter image description here

上面代码中的第二个错误是使用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)

enter image description here