【问题标题】:pandas sqlite read_sql dynamic in clausepandas sqlite read_sql 动态 in 子句
【发布时间】:2020-12-21 12:09:24
【问题描述】:

我正在尝试使用 pandas read_sql 函数从 sqlite DB 中查询一些数据。我需要使用包含 in 子句(列表)和一些静态参数的参数化 SQL。

以下是我的查询

battingDataQuery = ('SELECT ID, MATCH_DATE, ROLE, DOWN_NUM, NAME, RUNS,' 
                    'MATCH_ID, TEAM_NAME, VERSUS_TEAM_NAME, GROUND_NAME ' 
               'FROM BATTING_DATA WHERE ID in ({1}) '
                'AND DOWN_NUM < {0} AND MATCH_TYPE = {0}')

我已经使用格式适当地添加了占位符

battingDataQuery = battingDataQuery.format('?', ','.join('?' * len(playerIdList)))

我生成的SQL如下

'SELECT ID FROM BATTING_DATA WHERE ID in (?,?,?,?,?) AND DOWN_NUM < ? AND MATCH_TYPE = ?'

我被困在我发送参数的最后部分,如下所示:

battingDataDF = pd.read_sql_query(battingDataQuery , conn, params=(playerIdList,battingDownNum,'\'T20\''))

我在使用时遇到以下错误

提供的绑定数量不正确。当前语句使用 7, 并且提供了 3 个。

我已尝试使用以下变体,但仍然遇到相同的错误

battingDataDF = pd.read_sql_query(battingDataQuery , conn, params=[playerIdList,battingDownNum,'\'T20\'']) # same error

battingDataDF = pd.read_sql_query(battingDataQuery , conn, params=[playerIdList,battingDownNum,'\'T20\'']) # same error

battingDataDF = pd.read_sql_query(battingDataQuery , conn, params=[tuple(playerIdList),battingDownNum,'\'T20\'']) # same error

【问题讨论】:

    标签: pandas sqlite dataframe parameters read-sql


    【解决方案1】:

    你应该为你的 7 个问号提供一个包含 7 个参数的列表:

    battingDataDF = pd.read_sql_query(battingDataQuery , conn, params=playerIdList + [battingDownNum, "'T20'"])
    

    (您提供了 3 个参数:5 个数字的列表、一个数字和一个字符串,因此出现错误)

    【讨论】:

    • @Neel:对多次编辑/删除感到抱歉,现在它是正确的并经过测试。
    • 感谢这项工作。虽然我能够找到另一种有效的变体
    【解决方案2】:

    鉴于我的@stef 有效,但我能够找到另一个有效的变体。所以想为了完成而发布它

    battingDataDF = pd.read_sql_query(battingDataQuery , conn, params=(*playerIdList,battingDownNum,matchType))
    

    *导致列表被解包,从而导致提供正确数量的参数

    不确定哪种方法更好。如果有人可以对此发表一些看法,那就太好了。

    【讨论】:

    • 我想这只是一个口味问题:playerIdList + [battingDownNum, "'T20'"] 将最后两个参数转换为一个列表,然后合并两个列表,而 (*playerIdList, battingDownNum, "'T20'") 首先解压缩列表,然后将所有参数转换回一个元组。因此,在这两种情况下,我们都会得到 eventually are turned into a list and combined with the query statement 的所有参数的列表或元组。
    • 所以我更喜欢前一种解决方案,因为解压列表只是为了将其重新打包到另一个列表中对我来说似乎不太直观,但正如我所说,这似乎是个人喜好问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2012-11-30
    • 2011-10-30
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多