Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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_Sql_List - Fatal编程技术网

在python中将列表传递给sql

在python中将列表传递给sql,python,sql,list,Python,Sql,List,我正在尝试将列表传递给sql。从我发现的情况来看,列表没有bindtype。因此,我尝试将列表转换为字符串: 以下是我正在尝试执行的sql: select a,b,sum(c) as total from t where d in ('x','y') group by 1,2 由于必须对其进行参数化,我使用了以下方法: import pandas as pd import pyodbc #conn_vertica -- connection object to vertica f_list =

我正在尝试将列表传递给sql。从我发现的情况来看,列表没有bindtype。因此,我尝试将列表转换为字符串: 以下是我正在尝试执行的sql:

select a,b,sum(c) as total from t where d in ('x','y') group by 1,2
由于必须对其进行参数化,我使用了以下方法:

import pandas as pd
import pyodbc
#conn_vertica -- connection object to vertica
f_list = ['x','y']
sql_test=   select a,b,sum(c) as total from t where d in (%s) group by 1,2
l = ', '.join(map(lambda x: '%s',f_list))
sql_test = sql_test % l
df_test = pd.read_sql(sql_test,conn_vertica) # to read it into a dataframe
运行此命令时,我收到一个错误:

pandas.io.sql.DatabaseError: Execution failed on sql 'select a, b, sum(c) as total from t where d in (%s, %s)  group by 1,2': ('42601', '[42601] ERROR 4856:  Syntax error at or near "%" at character 123\n (4856) (SQLExecDirectW)')

关于如何将列表传递到sql的任何建议,您可以将其作为元组传递:

sql_test = "SELECT a, b, SUM(c) AS total FROM t WHERE d IN {0} GROUP BY 1, 2".format(tuple(f_list))

>>> sql_test
"SELECT a, b, SUM(c) AS total FROM t WHERE d IN ('x', 'y') GROUP BY 1, 2"

在sql\u test=sql\u test%l行之后打印sql\u test时,这是输出:从t中选择a、b、sumc作为总计,其中d在%s中,%s按1,2tanks@Alexander分组,成功了。还有其他方法吗?我的方法错了吗?通常有几种方法来完成相同的任务,尽管应该有一种——最好只有一种——显而易见的方法来完成。我对pyodbc不够熟悉,无法评论您的方法。在我的查询中,我需要传递多个参数。因此,对于第一个参数,我使用了{0}和.formattupelist。对于我尝试使用{1}的第二个参数,这个数字表示参数的位置:查询如下:sql_test=选择a,b,SUMc作为t中的total,其中d在{0}中,e=to_date{1},'yyyyy-mm-dd'按1分组,2。formattuplef_列表,historical_date历史_date='2015-05-01'-这是在开始时初始化的。我得到了一个错误,没有方法来_dateint,未知的是这个用法是错误的…和e={1}…formattuplef_列表,历史日期可能会工作。如果不是,那就是pyodbc的问题。我试过了…当我打印sql时..这就是它的样子。e=2015-05-01………错误:可能需要was explict type cast…我尝试使用strhistorical_start_date,但打印时仍然没有引号…是否有方法将其打印为字符串或在其上附加引号…即e='2015-05-01'