Pandas sqlite read_sql动态in子句
我正在尝试使用pandas read_sql函数从sqlite数据库查询一些数据。我需要使用参数化SQL,它包含in子句(List)和一些静态参数 下面是我的问题Pandas sqlite read_sql动态in子句,pandas,sqlite,dataframe,parameters,read-sql,Pandas,Sqlite,Dataframe,Parameters,Read Sql,我正在尝试使用pandas read_sql函数从sqlite数据库查询一些数据。我需要使用参数化SQL,它包含in子句(List)和一些静态参数 下面是我的问题 battingDataQuery = ('SELECT ID, MATCH_DATE, ROLE, DOWN_NUM, NAME, RUNS,' 'MATCH_ID, TEAM_NAME, VERSUS_TEAM_NAME, GROUND_NAME ' 'FRO
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}')
我生成的SQL如下所示
'SELECT ID FROM BATTING_DATA WHERE ID in (?,?,?,?,?) AND DOWN_NUM < ? AND MATCH_TYPE = ?'
使用此工具时出现以下错误
提供的绑定数量不正确。当前语句使用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
您应该为7个问号提供7个参数的列表:
battingDataDF = pd.read_sql_query(battingDataQuery , conn, params=playerIdList + [battingDownNum, "'T20'"])
(您提供了3个参数:一个包含5个数字的列表、一个数字和一个字符串,因此出现了错误)如果我的@stef有效,则回答有效,但我能够找到另一个有效的变体。所以我想把它贴出来是为了完成
battingDataDF = pd.read_sql_query(battingDataQuery , conn, params=(*playerIdList,battingDownNum,matchType))
*使列表解包,从而提供正确数量的参数
不确定哪种方法更好。如果有人能对此发表一些看法,那就太好了。@Neel:很抱歉,多次编辑/删除,现在它是正确的,经过测试。谢谢,这一切都成功了。虽然我能找到另一个有效的变体,但我想这只是一个品味问题:
playerIdList+[battingDownNum,'T20'”
将最后两个参数转换为一个列表,然后将这两个列表合并而成(*playerIdList,battingDownNum,'T20'))
首先解压缩列表,然后将所有参数转换回元组。因此,在这两种情况下,我们都会得到一个包含所有参数的列表或元组。因此,我更喜欢前一种解决方案,因为对我来说,解包列表只是为了将其重新打包到另一个列表似乎不那么直观,但正如我所说,这似乎是个人偏好的问题。
battingDataDF = pd.read_sql_query(battingDataQuery , conn, params=playerIdList + [battingDownNum, "'T20'"])
battingDataDF = pd.read_sql_query(battingDataQuery , conn, params=(*playerIdList,battingDownNum,matchType))