Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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_Pandas_Filter - Fatal编程技术网

Python 使用多个参数和列表读取sql

Python 使用多个参数和列表读取sql,python,sql,pandas,filter,Python,Sql,Pandas,Filter,我有以下脚本: now = dt.datetime.now() date_filter = now - timedelta(days=3) list_ids = [1,2,3] dq_connection = mysql.connector.connect(user='user', password='pass', host='localhost', database='db') engine = create_engine('localhost/db') cursor = connection

我有以下脚本:

now = dt.datetime.now()
date_filter = now - timedelta(days=3)
list_ids = [1,2,3]
dq_connection = mysql.connector.connect(user='user', password='pass', host='localhost', database='db')
engine = create_engine('localhost/db')
cursor = connection.cursor(buffered=True)
query = ('''
SELECT *
FROM (SELECT * FROM myTable1 WHERE id in {%s}
WHERE date >= %s;
''')
df = pd.read_sql_query(query, connection,params=(list_ids,date_filter,))
我想在我的查询中有两个过滤器: 1) 列出我在列表ID上拥有的所有ID 2) 仅筛选日期之前的日期。\u筛选

第二个过滤器我可以做到,但当我尝试使用列表时,我得到:

pandas.io.sql.DatabaseError: Execution failed on sql

我做错了什么

因为子句中的
接收多个值,您需要使用所需数量的占位符调整准备好的语句,
%s
,然后使用
func(*list)
解压参数列表。另外,
WHERE
子句都不需要子查询

query = '''SELECT * FROM myTable1 
           WHERE id in (%s, %s, %s) AND date >= %s;
        '''

df = pd.read_sql_query(query, connection, params=(*list_ids, date_filter))
对于等于列表长度的动态占位符,请集成
str.join

placeholders = ", ".join(["%s" for _ in list_ids])

query = '''SELECT * FROM myTable1 
           WHERE id in ({}) AND date >= %s;
        '''.format(placeholders)

df = pd.read_sql_query(query, connection, params=(*list_ids, date_filter))

*列表\u id
在这里做什么?为什么不仅仅是
list\u id
?@DaveRGP,正如解决方案中的文本所提到的,这样您就可以将列表中的每个字符串匹配到SQL语句中相应的
%s
。否则,您将尝试为4个参数(需要4个标量)绑定2个对象(一个是iterable而不是标量),因此数据库引擎将出错。非常好,一条注释-您不需要将联接中的表达式显式地作为列表大小写。对于一些语法上的修饰,您可以将表达式保留为
占位符=“,”。join(“%s”表示列表中的“。”)
@keironstodart,很好。从这个问题开始,我学到了,
join
允许生成器。