MySQL 重复使用光标两次时发现未读结果
MySQL Unread Result Found When Reusing Cursor Twice
问候
我正在尝试在 Pi 上为智能锁编写一个 python 脚本,它可以检测 RFID 并使用 TOTP 对其进行身份验证。当我 运行 脚本时,它可以很好地检测到第一张卡,并且它从 #Start
完成到 #End
,但是当我尝试点击第二张卡时,它失败了 mysql.connector.errors.InternalError: Unread result found
在行 cursor.execute("Select id, name, secret From users Where rfid_uid="+str(id))
.
我该怎么做才能修复它,这样我就不需要重新 运行 脚本来检测第二张卡了。
两张卡的uid都在数据库中
脚本
try:
while True:
#Start
print("Place card near the scanner")
mylcd.lcd_display_string("Place card near",1)
mylcd.lcd_display_string("the scanner",2)
id, text = reader.read()
cursor.execute("Select id, name, secret From users Where rfid_uid="+str(id)) #Traceback said it crash here when Im trying to tap different card (second card)
result = cursor.fetchone()
if cursor.rowcount >= 1:
mylcd.lcd_clear()
print("Welcome, ", result[1])
mylcd.lcd_display_string("Welcome",1)
mylcd.lcd_display_string(result[1],2)
time.sleep(2)
mylcd.lcd_clear()
print("Type the code from your authenticator")
mylcd.lcd_display_string("Type in the code",1)
cursor.execute("Select secret From users Where rfid_uid="+str(id))
secret = result[2]
totp = pyotp.TOTP(str(secret))
otp = totp.now()
your_code = input('')
mylcd.lcd_display_string(your_code,2)
if your_code == otp:
mylcd.lcd_clear()
print("Code Valid, Opening the door")
mylcd.lcd_display_string("Code Valid",1)
mylcd.lcd_display_string("Opening the door",2)
time.sleep(5)
else:
mylcd.lcd_display_string("Invalid Code",1)
print("Invalid")
time.sleep(5)
mylcd.lcd_clear()
#End
except KeyboardInterrupt:
mylcd.lcd_clear()
print("\nApplication Stopped")
finally:
GPIO.cleanup()
谢谢!
如果我对问题的理解正确的话,我最近遇到了同样的问题。要使游标能够执行多次,可以为游标添加buffered 属性并将其设置为true。您可以这样添加:
cursorVariable = database.cursor(buffered = True)
希望这能解决您的问题,祝您好运!
问候
我正在尝试在 Pi 上为智能锁编写一个 python 脚本,它可以检测 RFID 并使用 TOTP 对其进行身份验证。当我 运行 脚本时,它可以很好地检测到第一张卡,并且它从 #Start
完成到 #End
,但是当我尝试点击第二张卡时,它失败了 mysql.connector.errors.InternalError: Unread result found
在行 cursor.execute("Select id, name, secret From users Where rfid_uid="+str(id))
.
我该怎么做才能修复它,这样我就不需要重新 运行 脚本来检测第二张卡了。
两张卡的uid都在数据库中
脚本
try:
while True:
#Start
print("Place card near the scanner")
mylcd.lcd_display_string("Place card near",1)
mylcd.lcd_display_string("the scanner",2)
id, text = reader.read()
cursor.execute("Select id, name, secret From users Where rfid_uid="+str(id)) #Traceback said it crash here when Im trying to tap different card (second card)
result = cursor.fetchone()
if cursor.rowcount >= 1:
mylcd.lcd_clear()
print("Welcome, ", result[1])
mylcd.lcd_display_string("Welcome",1)
mylcd.lcd_display_string(result[1],2)
time.sleep(2)
mylcd.lcd_clear()
print("Type the code from your authenticator")
mylcd.lcd_display_string("Type in the code",1)
cursor.execute("Select secret From users Where rfid_uid="+str(id))
secret = result[2]
totp = pyotp.TOTP(str(secret))
otp = totp.now()
your_code = input('')
mylcd.lcd_display_string(your_code,2)
if your_code == otp:
mylcd.lcd_clear()
print("Code Valid, Opening the door")
mylcd.lcd_display_string("Code Valid",1)
mylcd.lcd_display_string("Opening the door",2)
time.sleep(5)
else:
mylcd.lcd_display_string("Invalid Code",1)
print("Invalid")
time.sleep(5)
mylcd.lcd_clear()
#End
except KeyboardInterrupt:
mylcd.lcd_clear()
print("\nApplication Stopped")
finally:
GPIO.cleanup()
谢谢!
如果我对问题的理解正确的话,我最近遇到了同样的问题。要使游标能够执行多次,可以为游标添加buffered 属性并将其设置为true。您可以这样添加:
cursorVariable = database.cursor(buffered = True)
希望这能解决您的问题,祝您好运!