首页 > 解决方案 > 将字符串列表传递给原始 sql 查询(Python/Django)

问题描述

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

标签: pythonsqldjangopostgresql

解决方案


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

将一个反斜杠后跟任何其他字符意味着最终字符串中的某个其他字符,因为它正在发生在您的情况下。

在此处输入图像描述

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

在此处输入图像描述

这将完全符合您的要求。您可以在此处阅读有关此内容的更多信息。

另外,为了消除对最终字符串中双反斜杠的混淆,这只是一种视觉误解,如下所示,使用两个反斜杠不会导致最终字符串中出现两个反斜杠。

在此处输入图像描述

上面代码中的第二个错误是使用了元组函数,它返回一个元组对象而不是列表的字符串封闭形式。以下代码应该适合您。

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)

在此处输入图像描述


推荐阅读