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
允许生成器。