Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python列表传递到SQL查询_Python_List_Tuples - Fatal编程技术网

将Python列表传递到SQL查询

将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

我试图用光标搜索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_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
有谁能建议一种将我的列表转换成元组的方法,或者一种更好的方法,将我的项目转换成圆括号而不是方括号的格式

作为解决方法,我尝试将列表转换为string
str(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弹出。可能重复