将Python列表传递到SQL查询
我试图用光标搜索access表字段中的项目。然后我将它们附加到一个名为“distList”的列表中。我想将列表传递到公式中的SQL查询生成器“WHERE”子句中:将Python列表传递到SQL查询,python,list,tuples,Python,List,Tuples,我试图用光标搜索access表字段中的项目。然后我将它们附加到一个名为“distList”的列表中。我想将列表传递到公式中的SQL查询生成器“WHERE”子句中: "Field1" in distList 或者,长话短说,它看起来是这样的: "Field1" in ('ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)') SQL_QUERY = """ select * from abc where someCol = ({0}) """ SQL = SQL_QU
"Field1" in distList
或者,长话短说,它看起来是这样的:
"Field1" in ('ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)')
SQL_QUERY = """
select *
from abc
where someCol = ({0})
"""
SQL = SQL_QUERY.format(refinedList)
列表如下所示:
"Field1" in ('ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)')
SQL_QUERY = """
select *
from abc
where someCol = ({0})
"""
SQL = SQL_QUERY.format(refinedList)
[‘ds(c1)’‘ds(b1)’‘ds(c2)’‘ds(g1)’]
我遇到的问题是,上面的SQL等式不喜欢在python列表中查找。它无法识别方括号。它更喜欢圆括号,所以我考虑使用元组。我面临的问题是,我不知道如何在光标搜索access表中的项后构建元组。下面是我的代码示例:
distList = []
for lyr in arcpy.mapping.ListLayers(mxd, "", df):
if lyr.name == "Disturbance":
for row in arcpy.SearchCursor(lyr):
if "ds" in row.Field1:
distList.append(row.Field1)
lyr.definitionQuery = '"Field1"' + "in " + distList
有谁能建议一种将我的列表转换成元组的方法,或者一种更好的方法,将我的项目转换成圆括号而不是方括号的格式
作为解决方法,我尝试将列表转换为stringstr(distList)
,然后替换括号。这很好,但似乎很麻烦,我相信还有更好的方法
谢谢,
迈克,你有没有试过:
str(tuple(distList))
编辑:
以上内容仅适用于包含多个项目的列表
类似于Arun的回答更一般,因为它可以处理一个或多个项目:
distlist = '({})'.format(','.join(elem for elem in distlist))
不过,根据查询和RDBMS的不同,事先检查单个项目并在这种情况下使用相等运算符可能更有效。我从另一个站点收到了一个答案,所以我想我应该传递它。以下脚本将查询更改为字符串,并被接受为my definitionQuery。对于附加值,我“设置”列表以消除重复项:
if "ds" in row.Field1:
distList.append('"{}"'.format(row.Field1))
lyr.definitionQuery = '"Field1" in ({})'.format(", ".join(set(distList)))
预处理列表:
distList = ['ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)']
refinedList = ','.join(a for a in distList)
在WHERE子句中的SQL中传递refinedList,如下所示:
"Field1" in ('ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)')
SQL_QUERY = """
select *
from abc
where someCol = ({0})
"""
SQL = SQL_QUERY.format(refinedList)
这里的{0}是参数(refinedList)。查看pythonDocs以更好地理解String format()函数。
执行查询,将运行。谢谢gerrat。不幸的是,这似乎不起作用。我想我要传递的查询框也不喜欢元组。这实际上是一个注释,不是问题的答案。请使用“添加评论”为作者留下反馈。@Avi:好吧,这实际上是一个答案,但我像评论一样陈述它。“你试过了吗”是一种修辞,因为当我在他的数据上使用它时,得到的字符串看起来是正确的。当dicList有一个项目时,它将打印(xxx,)错误将出现。请记住,将参数传递给SQL查询的方法是使用
cursor.execute(查询,参数)
或同等产品,以避免SQL弹出。可能重复