首页 > 解决方案 > pd.read_sql_query 字符串列表参数折叠到第一个元素

问题描述

我遇到了一个奇怪的pandas.read_sql_query()方法问题,当我传递一个格式为字符串的列表参数时,该参数只读取列表的第一个元素并删除其他所有元素。原始列表是一个重新格式化为字符串的数字列表,因此理论上应该保留列表的所有元素。例如,此代码返回的数据帧:

    l = [1, 2, 3]
    l_as_str =  ", ".join([x for x in map(str, l)])
    
    QUERY = """SELECT * FROM table WHERE id in (%(l_as_str)s)"""
    
    df = pd.read_sql_query(QUERY, params={"l_as_str": l_as_str}, con=engine) 

...仅包含 id = 1 的项目,即 的第一个元素l。如果我切换元素的顺序(例如l = [2, 1, 3]),那么它只返回 id = 2 的项目。换句话说,l_as_str似乎只折叠到第一个元素。知道问题是什么吗?

标签: pandaspython-3.7

解决方案


只需使用 f 字符串进行简化。无需通过params

l = [1, 2, 3]
l_as_str =  ", ".join([x for x in map(str, l)])
    
QUERY = f"""SELECT * FROM table WHERE id in ({l_as_str})"""
df = pd.read_sql_query(QUERY, con=engine) 

推荐阅读