我正在尝试创建一个登录功能。但它只起作用。例如-当我提供错误的用户名和密码时,我收到正确的错误消息,在取消该消息并提供正确的用户名和密码后,我收到“无法登录”,然后我收到“pymysql.err.Error:已经关闭”,下面是示例代码.
import pymysql
# Connect to the database
connection = pymysql.connect(host='localhost',
user='root',
password='',
db='python_code',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
class LoginModel:
def check_user(self, data):
try:
with connection.cursor() as cursor:
# Read a single record
sql = "SELECT `username` FROM `users` WHERE `username`=%s"
cursor.execute(sql, (data.username))
user = cursor.fetchone()
print(user)
if user:
if (user, data.password):
return user
else:
return False
else:
return False
finally:
connection.close()
创建连接的次数(一次)和关闭连接的次数(每次登录尝试一次)不匹配。
一个解决办法是移动你的:
connection = pymysql.connect(host='localhost',
user='root',
password='',
db='python_code',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
进入你的
def check__user()
。它会起作用,因为您会在每次调用时创建并关闭连接(正如其他人指出的那样,finally
子句总是被执行。)
这不是一个很好的设计,因为获取数据库连接往往相对昂贵。因此,首选保持在方法的外部创建连接......这意味着您必须删除方法内的connection.close()
。
我认为您将
connection.close()
与
cursor.close()
混淆了。你想做后者,而不是前者。在您的示例中,您不必显式关闭光标,因为这会在您的 with connection.cursor() as cursor:
行中自动发生。 将
finally
更改为
except
,或完全移除 try
块。
except pymysql.MySQLError as e:
print(f"Error: {e}")
connection.rollback()
finally:
connection.close()
#parsed_data = parse_data(data)
print("Parsed data for table:::", parsed_data)
return "ok"