pypyodbc execute返回列表索引超出范围错误

时间:2017-07-30 05:24:09

标签: sql python-3.x pypyodbc

我有一个运行3个查询的函数并返回最后一个的结果(使用前面的那些创建最后一个)当我到达第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)

以下是我到达第3个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

任何帮助都会很棒

1 个答案:

答案 0 :(得分:0)

我有同样的错误。 即使我还没有就这个错误意味着什么得出明确的结论,我仍认为我的猜测可能会帮助到此为止的其他任何人。

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

所以我猜测 IndexError函数中的这个ctrl_err只是意味着您的SQL代码有一个错误,pypyodbc不知道如何处理。 / p>

我知道这并不是一个完整的答案,但是我知道,如果我不知道这不是pypyodbc中的错误,而是我插入的数据不一致,那就可以节省几个小时。 / p>

亲切的问候, 卢卡