Python,mysql.connector错误:没有结果集来取; cgitb显示传递给函数的正确值

时间:2017-05-28 21:59:58

标签: python mysql set

好吧,这让我感到困惑,所以我决定看看我是否能在这里找到答案,我上下搜索了几个stackoverflow问题和答案,似乎什么也没有用。我试图做的就是使用mysql.connector的SELECT * FROM语句,我不断得到一个" No Result Set"错误。这是代码:

def session_fetch(value1):
    cnx = mysql.connector.connect(user='xxx', password='xxx', 
    host='127.0.0.1', database='xxx') 
    cursor = cnx.cursor()
    query = ("SELECT * FROM sessionkeys "
             "WHERE clientName='%s';") % value1 
    cursor.execute(query)
    row = cursor.fetchall()
    results = len(cursor.fetchall())
    clientName, clientAddr, unLocker = row[1], row[2], row[3]
    cnx.commit()
    cursor.close()
    cnx.close()

cgitb的错误显示:  session_fetch中的C:\ inetpub \ wwwroot \ flighttoolsbz \ validator.py(value1 =' ericdsmith86')
    162 cursor.execute(查询)
    163 row = cursor.fetchall()
=> 164 results = len(cursor.fetchall())
    165 clientName,clientAddr,unLocker = row [1],row [2],row [3]
    166 cnx.commit()

InterfaceError:没有要从中获取的结果集。
      args =( - 1,'没有结果集来取自。',无)
      errno = -1
      msg ='没有结果集来取自。'
      sqlstate =无
      with_traceback = InterfaceError对象的内置方法with_traceback

但是当我浏览MySQL工作台并使用相同的输入值运行相同的查询时,它会返回我正在寻找的一行,所以它肯定存在。我唯一能想到的是%s格式化程序并没有将传递给函数的内容作为' value1'。我错过了什么?

2 个答案:

答案 0 :(得分:1)

你两次调用cursor.fetchall()。你不应该这样做。

变化:

row = cursor.fetchall()
results = len(cursor.fetchall())
clientName, clientAddr, unLocker = row[1], row[2], row[3]

要:

rows = cursor.fetchall()
results = len(rows) 
if results > 0:
    row = rows[0]
    clientName, clientAddr, unLocker = row[1], row[2], row[3]

虽然它与您当前的问题没有任何关系,但您应该使用参数化查询:

query = "SELECT * FROM sessionkeys WHERE clientName=?" 
cursor.execute(query, (value1,))

答案 1 :(得分:1)

正如clockwatcher所说,你曾两次打电话给cursor.fetchall(),他解决这个问题的解决方案可以解决这个问题。

编写SQL查询本身的方式会使代码面临严重的安全漏洞,因为查询不会正确地转义输入参数。与clockwatcher的响应类似,正确的SQL查询可能是:

query = ("SELECT * FROM sessionkeys WHERE clientName='%s'", (value1,))

此外,由于您未修改任何数据according to the mySQL connector documentation,因此无需调用commit()方法。

因此,结合所有三个更改,您的代码将类似于:

def session_fetch(value1):
    cnx = mysql.connector.connect(user='xxx', password='xxx', 
    host='127.0.0.1', database='xxx') 
    cursor = cnx.cursor()
    query = ("SELECT * FROM `sessionkeys` WHERE `clientName`='%s'", (value1,))
    cursor.execute(query)
    rows = cursor.fetchall()
    results = len(rows) 
    if results > 0:
        row = rows[0]
        clientName, clientAddr, unLocker = row[1], row[2], row[3]
    cursor.close()
    cnx.close()