【问题标题】:pypyodbc execute returns list index out of range errorpypyodbc 执行返回列表索引超出范围错误
【发布时间】:2017-07-30 05:24:08
【问题描述】:

当我到达第三个查询时,我有一个运行 3 个查询并返回最后一个查询的结果(使用以前的查询创建最后一个)的函数,它得到一个列表索引我们的范围错误。我已经将这个确切的查询作为第一个查询(使用手动输入的变量)运行,并且运行良好。

这是我的代码:

import pypyodbc

def sql_conn():
    conn = pypyodbc.connect(r'Driver={SQL Server};'
                            r'Server=HPSQL31\ni1;'
                            r'Database=tq_hp_prod;'
                            r'Trusted_Connection=yes;')
    cursor = conn.cursor()

    return conn, cursor


def get_number_of_jobs(ticket):
    # Get Connection
    conn, cursor = sql_conn()

    # Get asset number
    sqlcommand = "select top 1 item from deltickitem where dticket = {} and cat_code = 'Trq sub'".format(ticket)

    cursor.execute(sqlcommand)

    asset = cursor.fetchone()[0]

    print(asset)
    # Get last MPI date
    sqlcommand = "select last_test from prevent where item = {} and description like '%mpi'".format(asset)

    cursor.execute(sqlcommand)

    last_recal = cursor.fetchone()[0]

    print(last_recal)

    # Get number of jobs since last recalibration
    sqlcommand = """select count(i.item)
                    from deltickhdr as d
                    join deltickitem as i
                    on d.dticket = i.dticket
                    where i.start_rent >= '2017-03-03 00:00:00'
                    and i.meterstart <> i.meterstop
                    and i.item = '002600395'""" #.format(last_recal, asset)

    cursor.execute(sqlcommand)

    num_jobs = cursor.fetchone()[0]
    print(num_jobs)

    cursor.close()
    conn.close()

    return num_jobs

ticketnumber = 14195 # int(input("Ticket: "))
get_number_of_jobs(ticketnumber)

以下是我到达第三个 cursor.execute(sqlcommand) 时遇到的错误

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2016.3.2\helpers\pydev\pydevd.py", line 1596, in <module>
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2016.3.2\helpers\pydev\pydevd.py", line 974, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2016.3.2\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/bdrillin/PycharmProjects/Torque_Turn_Data/tt_sub_ui.py", line 56, in <module>
    get_number_of_jobs(ticketnumber)
  File "C:/Users/bdrillin/PycharmProjects/Torque_Turn_Data/tt_sub_ui.py", line 45, in get_number_of_jobs
    cursor.execute(sqlcommand)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pypyodbc.py", line 1470, in execute
    self._free_stmt(SQL_CLOSE)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pypyodbc.py", line 1994, in _free_stmt
    check_success(self, ret)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pypyodbc.py", line 1007, in check_success
    ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pypyodbc.py", line 972, in ctrl_err
    state = err_list[0][0]
IndexError: list index out of range

任何帮助都会很棒

【问题讨论】:

  • 键入此内容时,我想知道为什么我不考虑在一个查询中完成所有这些操作,并使用子查询来获取我需要的其他信息。这就像一个魅力,但仍然想知道我在帖子中遗漏了什么。
  • 当 pypyodbc 尝试检查查询结果时,它看起来像一个内部错误 (check_success)。当您print(pypyodbc.version) 时,您会得到什么?我刚刚用 pypyodbc 1.3.5 尝试了一个类似的查询,它对我来说很好。
  • 附加信息:这听起来像bug that was fixed in version 1.3.3
  • 我有1.3.5版

标签: sql python-3.x pypyodbc


【解决方案1】:

我遇到了同样的错误。 尽管我还没有得出关于这个错误意味着什么的明确结论,但我认为我的猜测可能会帮助其他人在这里结束。

在我的例子中,问题是与数据类型长度(NVARCHAR(24) 和 CHAR(10))的冲突。

所以我ctrl_err 函数中的这个IndexError 只是意味着你的SQL 代码中存在pypyodbc 不知道如何处理的错误。

我知道这不是一个很好的答案,但我知道如果我知道这不是 pypyodbc 中的一些错误,而是我插入的数据不一致,它会为我节省几个小时。

亲切的问候, 卢卡

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多