python - 将字符串列表传递给原始 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 项目已被转换为一些奇怪的字符串。
解决方案
反斜杠是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)
推荐阅读
- hyperledger-fabric - 我们可以为每个参与者添加多个通道并在超级账本结构网络中识别吗
- ios - 使用选择器使用未解析的标识符
- java - 布局测量尺寸返回 0
- google-cloud-platform - 如何在 Hbase Row 和 Bigtable Row 上设置 TTL
- angularjs - 使用 ionic 3 在模态页面中显示选定的行数据
- java - 如何这个 JSON Parsing Android 无限数据
- javascript - 现有 jQuery 对象的 jQuery 多个选择器
- jquery - 在联系表格 7 中创建多组选择下拉菜单
- angularjs - PDF 内容显示问题
- python - Numpy Matrix If/Else 分类?