pandas sqlite read_sql 动态子句

pandas sqlite read_sql dynamic in clause

我正在尝试使用 pandas read_sql 函数从 sqlite 数据库中查询一些数据。我需要使用包含子句 (List) 和一些静态参数的参数化 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\''))

我在使用这个时遇到以下错误

Incorrect number of bindings supplied. The current statement uses 7, and there are 3 supplied.

我尝试使用以下变体,但仍然出现相同的错误

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

您应该为 7 个问号提供 7 个参数的列表:

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

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

答案是我的@stef 有效,但我能够找到另一个有效的变体。所以想要post为了完成

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

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

不确定哪种方法更好。如果有人可以 post 对此有所了解,那就太好了。