【问题标题】:How to pass a data frame as parameter to a SQL query in Python?如何将数据框作为参数传递给 Python 中的 SQL 查询?
【发布时间】:2023-03-10 14:56:02
【问题描述】:

我有一个包含一列值的数据框,我想将其作为参数传递以执行以下 sql 查询:

query = "SELECT ValueDate, Value"\
        "FROM Table "\
        "WHERE [ID] in ( ? ) "

所以我尝试了(在许多其他事情中)以下内容:

      df = pd.read_sql_query(query, conn, params=[ df['ID'].values ])
      df = pd.read_sql_query(query, conn, params=[ df['ID'].tolist ])
      df = pd.read_sql_query(query, conn, params=[ list(df['ID'].values) ])
       ...

传递数据帧值的正确方法是什么?

注意:我使用的是 Microsoft SQL Server,因此需要像我一样对查询进行格式化。

【问题讨论】:

  • 现在您已经指定了 sql-server,表值参数可能是要走的路。

标签: python sql pandas dataframe


【解决方案1】:
params = tuple(df['ID'].values)
sql = "SELECT COUNT(*) FROM foobar WHERE id IN (%s)" % (",".join(["?"]*len(params)),)
cursor.execute(sql, params)

【讨论】:

  • 谢谢,但我忘了说我使用的是 Microsoft SQL Server,所以查询需要按照我的问题进行格式化。
  • 考虑添加对您发布的代码如何工作的描述,这将对将来访问此帖子的用户有所帮助。
【解决方案2】:

这能满足您的需要吗?

import pandas as pd

your_column = pd.Series([1,2,3,4,5,6,7,8,9])

query = "SELECT ValueDate, Value"\
        "FROM Table "\
        "WHERE [ID] in {}".format(tuple(your_column))

print(query)
# 'SELECT ValueDate, ValueFROM Table WHERE [ID] in (1, 2, 3, 4, 5, 6, 7, 8, 9)'

那么你应该可以在没有更多参数的情况下进行查询。

df = pd.read_sql_query(query, conn)

【讨论】:

  • 这仅在您的列包含多行时才有效。如果它只有一行,将其转换为元组将导致 SQL 错误。查询看起来像“.... where [ID] in (1,)”。当您将结果转换为元组时。
猜你喜欢
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 2019-01-02
  • 2011-07-23
相关资源
最近更新 更多