pymysql.err.Error: 已经关闭

Raj*_*ngh 5 python web.py pycharm

我正在尝试创建登录功能。但它只适用于那些。前 - 当我提供错误的用户名和密码时,在取消该消息并提供正确的用户名和密码后,我得到了正确的错误消息“无法登录”,然后我得到“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()
Run Code Online (Sandbox Code Playgroud)

pbu*_*uck 3

您创建连接的次数(一次)和关闭连接的次数(每次登录尝试一次)不匹配。

一种解决方法是移动您的:

connection = pymysql.connect(host='localhost',
                             user='root',
                             password='',
                             db='python_code',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)
Run Code Online (Sandbox Code Playgroud)

进入你的def check__user(). 它会起作用,因为您会在每次调用时创建并关闭连接(正如其他人指出的那样,该finally子句总是会被执行。)

这不是一个很好的设计,因为获取数据库连接往往相对昂贵。因此,首选保持在方法外部创建的连接......这意味着您必须删除connection.close()方法内的连接。

我认为你混淆connection.close()cursor.close()。你想做后者,而不是前者。在您的示例中,您不必显式关闭光标,因为这会在您的with connection.cursor() as cursor:行中自动发生。

更改finallyexcept,或try完全删除该块。