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

2024-04-23 18:50:40 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,这个让我困惑,所以我决定看看是否能在这里找到答案,我已经上下搜索了好几个堆满的问题和答案,似乎什么都没用。我所要做的只是使用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的错误显示: C: 会话获取中的\inetpub\wwwroot\flighttoolsbz\validator.py(value1='ericdsmith86')
162 cursor.execute(查询)
163行=cursor.fetchall()
=>;164 results=len(cursor.fetchall())
165 clientName,clientAddr,unLocker=行[1],行[2],行[3]
166 cnx.commit()

接口错误:没有要从中获取的结果集。
args=(-1,'没有要从中提取的结果集',无)
错误号=-1
msg='没有要从中提取的结果集。'
sqlstate=无
with_traceback=内置方法with_traceback of InterfaceError object

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


Tags: 答案fromexecuteconnector错误mysqlqueryselect
2条回答

正如钟表观察家所说,你给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()

您正在调用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,))

相关问题 更多 >