【问题标题】:pandas' read_sql with a list of values for WHERE condition带有 WHERE 条件值列表的 pandas 的 read_sql
【发布时间】:2015-04-28 09:39:54
【问题描述】:

假设一个数据框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_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 条件,是否有可能以不同的方式执行此操作?我在 Google 上搜索了几个小时,其中一些提到了 read_sql 的“参数”,但我无法弄清楚。

【问题讨论】:

    标签: python mysql pandas


    【解决方案1】:

    正如 bolec_kolec 所建议的,我认为最好的做法是在调用 read_sql 时使用params。这是我通常的做法(Python 3.7):

    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)
    

    【讨论】:

      【解决方案2】:

      您实际上可以在没有任何循环的情况下执行此操作。

      queryString = 'SELECT * FROM tableA WHERE sec_code in '+tuple(scoreDF.index)
      

      这将直接给出结果。假设scoreDF.indexlist。如果它已经是tuple,则不需要进行类型转换。

      【讨论】:

      • 像魅力一样工作。谢谢!
      • 我需要 str(tuple(scoreDF.index)) 来避免错误。 (由于 python 3,我认为。)
      • 我也需要 str(tuple(scoreDF.index)) 并且我使用的是 Python 2.7
      • 你应该在read_sql中使用params参数来避免sql注入
      • 如何将它用于 2 个或更多元组?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2020-01-09
      • 1970-01-01
      相关资源
      最近更新 更多