Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas sqlite read_sql动态in子句_Pandas_Sqlite_Dataframe_Parameters_Read Sql - Fatal编程技术网

Pandas sqlite read_sql动态in子句

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

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