【问题标题】:Can't get mysql results more than once无法多次获取mysql结果
【发布时间】:2020-04-17 00:32:43
【问题描述】:

我正在努力让我的套接字服务器 python 脚本每隔一段时间循环一次,以检查 mysql 表中的更新。

代码第一次运行没问题。在第二个循环和它引发错误后的每个循环上。
我尝试过的事情:

  • try/catch(用于多个循环以查看是否有任何工作)

  • 线程

  • conn.close()

  • cursor.close() (不是 cursor.commit() 任何更改,因此通过 当然是错误)

但是,我可以将代码放在一个独立的文件中,然后垃圾邮件运行该文件,它可以完美运行。 它似乎不喜欢在同一个进程或文件中运行 sql 代码(我认为线程已修复但我想我错了?)

这是错误:(注意第一行是我试图在循环中打印以进行测试的输出)

(17, 'Default2', 1, 'uploads/2/projects/5e045c87109820.19290695.blend', '')
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1776.0_x64__qbz5n2kfra8p0\lib\threading.py", line 926, in _bootstrap_inner
    self.run()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1776.0_x64__qbz5n2kfra8p0\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "D:\xampp\htdocs\urender\serverfiles\test.py", line 7, in func
    fqueue = queuedb.checkQueue()
  File "D:\xampp\htdocs\urender\serverfiles\queuedb.py", line 7, in checkQueue
    cursor = conn.cursor()
  File "C:\Users\hackn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\mysql\connector\connection.py", line 806, in cursor
    self.handle_unread_result()
  File "C:\Users\hackn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\mysql\connector\connection.py", line 1059, in handle_unread_result
    raise errors.InternalError("Unread result found")
mysql.connector.errors.InternalError: Unread result found

[Finished in 6.727s]

这是来自 test.py 的基本代码:

import queuedb
from threading import Thread
import time

def func():
    time.sleep(5)
    fqueue = queuedb.checkQueue()
    return fqueue
    func()

fqueue = queuedb.checkQueue()
print(fqueue)

Thread(target=func).start()

这是来自我的 queuedb.py:

from dbconnect import dbconnect
import sys

def checkQueue():
    sql = "SELECT * FROM renderqueue WHERE renderer=''"
    conn = dbconnect.conn
    cursor = conn.cursor()

    cursor.execute(sql)
    result = cursor.fetchone()

    return result

这是 dbconnect.py:

import mysql.connector
import sys
from xml.dom import minidom

def parseXML():
    try:
        xmlpath = "urender/serverfiles/dbvariables.xml"
        mydoc = minidom.parse(xmlpath)
        items = mydoc.getElementsByTagName('item')
        dbserver = items[0].attributes['dbserver'].value
        dbuser = items[1].attributes['dbuser'].value
        dbpass = items[2].attributes['dbpass'].value
        dbname = items[3].attributes['dbname'].value
        return dbserver, dbuser, dbpass, dbname
    except:
        print("Something went wrong with the XML DATA")
        sys.exit()

dbserver = parseXML()[0]
dbuser = parseXML()[1]
dbpass = parseXML()[2]
dbname = parseXML()[3]

class dbconnect:
    conn = mysql.connector.connect(host=dbserver, user=dbuser, passwd=dbpass, database=dbname)

对于这么长的帖子我很抱歉,但我希望我已经充分解释了这个问题并提供了足够的信息。

【问题讨论】:

  • 我想指出,我还有 4 个其他函数可以从 db 表中插入或删除,它们在循环中运行得非常好。

标签: python mysql sql loops


【解决方案1】:

hckm101,

如异常所示,存在与您的光标关联的未读行。 要解决这个问题,您有两个解决方案:

  • 使用缓冲游标,将代码替换为 conn.cursor(buffered=True)
  • 或者,使用 for 循环检索与光标关联的每个结果,例如:for row in cursor: dosomething(row)

如需更多信息,可在线获取大量文档 (here)

【讨论】:

  • 刚刚更改为“cursor = conn.cursor(buffered=True)” 但是,当我循环它时,它输出一个并在没有递归的情况下完成循环。我是否误解了如何使用它?
  • 我认为我的答案尚不清楚,我的意思是您可以将游标设置为缓冲并仅获取一个结果,或者保持原样并遍历每一行。尝试第二个选项,保持光标声明不变并遍历行。
  • SunPaz 所以我意识到我有函数返回值而不是打印它..所以这就是为什么它停止为这种混乱感到抱歉......但是,我只是将它设置为打印并且它工作得很好现在。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
相关资源
最近更新 更多