1

我正在尝试使用 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
4

2 回答 2

1

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

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

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

于 2020-12-21T13:10:55.987 回答
0

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

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

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

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

于 2020-12-25T16:59:11.227 回答