【问题标题】:SQL query using pyodbc where the selected data is in a dataframe使用 pyodbc 的 SQL 查询,其中所选数据位于数据框中
【发布时间】:2019-03-05 09:36:04
【问题描述】:

当我想在之后将查询的数据内部连接到 pandas 数据帧时,查询我的 SQL (T-SQL) 数据库的最有效方法是什么?

我不知道如何通过 PYODBC 查询将信息从 Python 传递到 SQL,所以我目前最好的想法是以我知道与我的 Python 数据框一致的方式形成查询(即我知道所有信息都有 STARTDATE > 2016,所以我很容易提出要求,而且我知道 PRODUCT = Private_Car)。但是,如果我使用:

SELECT *
FROM rmrClaim
WHERE (PRODUCT = 'Private_Car') AND (YEAR >= 2016)

我仍然会引入比必要更多的数据。我宁愿能够做的是从 SQL DB 中仅选择包含我的合并键 (ID) 的数据。

是否有更有效的方法来查询数据库,以便在给定 pandas 数据框的情况下,我只能带来之后内部连接所需的数据? 我可以使用 PYODBC 将 python 中的列表传递到 sql 查询中吗?

编辑 - 尝试不同的措辞:

我有一个来自 CSV 的数据框(数据框 A),我想从我的 SQL 数据库中获取数据以生成一个数据框(数据框 B)。我的 SQL DB 中的数据比数据帧 A 中的数据大得多,所以我希望能够发送一个 SQL 查询,它只请求数据帧 A 中的数据,这样我就不会得到一个数据帧 B比数据框 A 大 10 倍。我目前的想法是使用我对数据框 A 的了解(即数据框 A 中的所有数据都在 2016 年之后)但是如果有办法将列表传递到我的 SQL 查询中,我可以更高效地查询数据子集

【问题讨论】:

  • 使用 pymssql 并在将查询传递给 pandas 数据框之前编写查询。你需要一个例子吗?
  • “所以我希望能够发送一个只请求数据帧 A 内的数据的 SQL 查询”——我很困惑。如果您确实需要将您检索到的数据与 DataFrame 行进行 LEFT JOIN,那么根据定义,您的 SQL 查询将需要检索 DataFrame 中 not 的行。如果您只想检索与 DataFrame 中的行匹配的行,那么 INNER JOIN 就足够了。
  • @Gord Thompson,你是对的,内部连接是正确的。问题是关于如何从 SQL DB 中检索数据,这使得内部联接完全匹配 SQL DB 中的 ID 和我的 csv 中的 ID,而不会带来额外的数据。更正了主要帖子。

标签: python sql pandas tsql pyodbc


【解决方案1】:

使用pyodbc 并在将查询传递给pandas 数据框之前编写查询。这是一个例子:

import pandas as pd
import pyodbc
connstr = "Driver={SQL Server};Server=MSSQLSERVER;Database=Claims;Trusted_Connection=yes;"
df = pd.read_sql("SELECT * FROM rmrClaim WHERE (PRODUCT = 'Private_Car') AND (YEAR >= 2016) AND ID in {} ".format(dfA.Column), pyodbc.connect(connstr))
df

【讨论】:

  • 我使用的是 Pyodbc 而不是 pymssql,但看起来是一样的。所以这本质上就是我当前的解决方案,但在这里我将所有信息从数据库中带入数据框。问题是它是我需要的数据的 10 倍。我目前在 Python 中有一个不同的数据框,我希望将来自 SQL DB 的数据加入其中。我正在寻找一种从 SQL DB 中选择数据的方法,它与我以前(​​已经在 Python 中)数据帧中的数据对齐。
  • 我真的不清楚你的意思。您可以使用合并和公共列连接两个数据框。也许改写这个问题。显示您尝试合并的两个数据框的示例。
  • 我有一个来自 CSV 的数据框(数据框 A),我想从我的 SQL DB 中获取数据以生成一个数据框(数据框 B)。我的 SQL DB 中的数据比数据帧 A 中的数据大得多,所以我希望能够发送一个 SQL 查询,它只请求数据帧 A 中的数据,这样我就不会得到一个数据帧 B比数据框 A 大 10 倍。我目前的想法是使用我对数据框 A 的了解(即数据框 A 中的所有数据都在 2016 年之后)但是如果有办法将列表传递到我的 SQL 查询中,我可以更高效地查询数据子集
  • 好的,我知道了。您实际上可以将一列传递到 SQLDB 查询中以按 ID 进行过滤。请参阅我使用元组函数在答案中所做的修改。
  • 这似乎是正确的答案,我遇到了一个问题(TypeError: Can't convert 'tuple' object to str implicitly)。我尝试使用 +str(tuple(dfA.Column) 仍然没有成功。知道如何解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2012-07-12
  • 1970-01-01
  • 2020-10-18
  • 2021-12-06
  • 2021-12-18
相关资源
最近更新 更多