Python 熊猫';读取带有WHERE条件值列表的sql
假设一个数据帧Python 熊猫';读取带有WHERE条件值列表的sql,python,mysql,pandas,Python,Mysql,Pandas,假设一个数据帧scoreDF: date time score sec_code 1048 2015-02-25 09:21:00 28 2888 2015-02-25 09:21:00 25 945 2015-02-25 09:21:00 23 4 2015-02-25 09:21:00 22 669 2015-02-25 09:21:00 15 我需
scoreDF
:
date time score
sec_code
1048 2015-02-25 09:21:00 28
2888 2015-02-25 09:21:00 25
945 2015-02-25 09:21:00 23
4 2015-02-25 09:21:00 22
669 2015-02-25 09:21:00 15
我需要进行MySQL查询,以检索与scoreDF.index
中的值匹配的所有行,即sec\u code
列
通常我会做一个循环:
finalResultDF = DataFrame()
queryString = 'SELECT * FROM tableA WHERE sec_code = ' + code
for code in scoreDF.index:
queryResultDF = sql.read_sql(queryString, con)
finalResultDF.append(queryResultDF)
如果没有一个循环传递一个值列表,例如,
scoreDF.index
作为WHERE条件,是否可以进行不同的操作?我在谷歌上搜索了几个小时,有人提到“参数”来阅读sql,但我想不出来。实际上,你可以不用任何循环来完成这项工作
queryString = 'SELECT * FROM tableA WHERE sec_code in '+tuple(scoreDF.index)
这将直接给出结果。这是假设
scoreDF.index
是一个列表
。如果它已经是一个元组
,那么就不需要进行类型转换。正如bolec_kolec建议的那样,我认为最好的做法是在调用read_sql时使用参数
。我通常是这样做的(Python 3.7):
工作起来很有魅力。非常感谢。我需要str(tuple(scoreDF.index))来避免错误。(我想是由于Python3的缘故)我还需要str(tuple(scoreDF.index)),我正在使用Python2.7,您应该在read_sql中使用
params
参数来避免sql注入
scoreIndex = scoreDF.index.tolist()
queryString = 'SELECT * FROM tableA WHERE sec_code = ANY(%(scoreIndex)s)'
queryParams = {'scoreIndex': scoreIndex}
queryResultDF = sql.read_sql(sql = queryString, con, params = queryParams)