首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python,mysql.connector错误:没有要从中提取的结果集;cgitb显示传递给函数的正确值

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

Stack Overflow用户
提问于 2017-05-29 05:59:58
回答 2查看 18.2K关注 0票数 2

好吧,这个问题让我很困惑,所以我决定看看我是否能在这里找到一个答案,我上下搜索了几个堆栈溢出的问题和答案,似乎什么都没有用。我所要做的就是使用mysql.connector执行SELECT * FROM语句,但一直收到"No Result Set“错误。代码如下:

代码语言:javascript
复制
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’)

代码语言:javascript
复制
 162     cursor.execute(query)
代码语言:javascript
复制
 163     row = cursor.fetchall()

=> 164结果= len(cursor.fetchall())

代码语言:javascript
复制
 165     clientName, clientAddr, unLocker = row[1], row[2], row[3]
代码语言:javascript
复制
 166     cnx.commit()

InterfaceError:没有要从中提取的结果集。

代码语言:javascript
复制
    args = (-1, 'No result set to fetch from.', None)
代码语言:javascript
复制
    errno = -1 
代码语言:javascript
复制
   msg = 'No result set to fetch from.' 
代码语言:javascript
复制
   sqlstate = None 
代码语言:javascript
复制
   with\_traceback = built-in method with\_traceback of InterfaceError object

但是,当我遍历MySQL工作台并使用相同的输入值运行相同的查询时,它返回我正在查找的一行,因此它肯定在那里。我能想到的唯一一件事是%s格式化程序没有将传递给函数的内容作为'value1‘。我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-29 06:50:48

您正在调用cursor.fetchall()两次。你不该这么做。

更改:

代码语言:javascript
复制
row = cursor.fetchall()
results = len(cursor.fetchall())
clientName, clientAddr, unLocker = row[1], row[2], row[3]

至:

代码语言:javascript
复制
rows = cursor.fetchall()
results = len(rows) 
if results > 0:
    row = rows[0]
    clientName, clientAddr, unLocker = row[1], row[2], row[3]

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

代码语言:javascript
复制
query = "SELECT * FROM sessionkeys WHERE clientName=?" 
cursor.execute(query, (value1,))
票数 5
EN

Stack Overflow用户

发布于 2017-05-29 07:07:02

正如时钟守望者所说,您调用了cursor.fetchall()两次,他的解决方案可以解决问题。

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

代码语言:javascript
复制
query = ("SELECT * FROM sessionkeys WHERE clientName='%s'", (value1,))

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

因此,将所有这三个更改合并在一起,您的代码将如下所示:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44232426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档