【问题标题】:Trying to use pandas Dataframes with sql select query尝试将 pandas Dataframes 与 sql select 查询一起使用
【发布时间】:2021-12-07 17:20:07
【问题描述】:

所以我是 Python 和 sql 的新手。 我正在使用 pandas 和 pyodbc。

firstQuery = pd.read_sql_query(
        '''
            SELECT  PORel.RelQty, PODetail.POLine, PORel.PORelNum, PORel.DueDate
            FROM *****.Erp.PODetail INNER JOIN *****.Erp.PORel ON 
            ((PODetail.Company = PORel.Company) and (PODetail.PONUM = PORel.PONum)) and 
            (PODetail.POLine = PORel.POLine)
            WHERE  PODetail.PONUM = ? and PODetail.Company= ? and PODetail.PartNum = ?
        ''', data, dfRaw )

dfRaw 是一个包含 3 列的 Dataframe。

  po_number company cyt_part_number
0    111111    TEST        abc12345

这是我尝试执行代码时收到的错误:

('07002', '[07002] [Microsoft][ODBC SQL Server Driver]COUNT 字段不正确或语法错误 (0) (SQLExecDirectW)')

我想知道是否有人可以给我一些关于它失败的原因以及关于如何让它工作的有用提示。

如果需要,我可以提供更多数据。 提前致谢。

【问题讨论】:

  • 由于这里没有发生聚合(通常会将这种类型的错误与“COUNT”相关的错误相关联),因此您可能没有提供适当数量的参数,因为您有占位符在您的 WHERE 子句中。可以分享一下参数列表dfRaw的相关细节吗?
  • 我添加了 dfRaw Dataframe 的样子。
  • 您正在向 sql 中发送一个数据帧,而不是一个值。使用 dfRaw['po_number'][0] dfRaw['cyt_part_number'][0] 代替数据和 dfRaw
  • data 是您的联系人吗?
  • 是的,data就是连接名。

标签: python sql-server pandas pyodbc


【解决方案1】:

您将 pandas 数据帧作为参数传递,而 read_sql_query 需要一个列表、元组或字典。您可以改为将第一行作为列表传递:

firstQuery = pd.read_sql_query(
        '''
            SELECT  PORel.RelQty, PODetail.POLine, PORel.PORelNum, PORel.DueDate
            FROM *****.Erp.PODetail INNER JOIN *****.Erp.PORel ON 
            ((PODetail.Company = PORel.Company) and (PODetail.PONUM = PORel.PONum)) and 
            (PODetail.POLine = PORel.POLine)
            WHERE  PODetail.PONUM = ? and PODetail.Company= ? and PODetail.PartNum = ?
        ''', data, params = dfRaw.iloc[0].tolist() )

【讨论】:

  • 所以 dfRaw 每次都不会是相同的长度。我应该使用 while 循环遍历每一行吗?
  • 这取决于您打算如何处理结果。要使用不同的参数集多次执行查询,迭代可能是一种方法。如果您想要一个结果集中单个查询的所有结果,您还可以修改 SQL 查询以直接为您提供适当的结果。像this SO post 这样的东西。但在我看来,这将是一个后续问题。您应该看看这个问题是否已解决,accept and/or vote if appropriate,如果需要,请询问新问题。
  • 我最终做了一个while循环。在将数据添加到最终文件之前,它可以更轻松地修改数据。但是这个答案完全有效。我最近才重新开始编程,所以有点生疏。感谢您的帮助!
猜你喜欢
  • 2022-10-21
  • 2022-01-03
  • 1970-01-01
  • 2020-11-24
  • 2011-11-17
  • 2015-12-28
  • 2019-04-06
  • 1970-01-01
  • 2018-06-08
相关资源
最近更新 更多