pymysql.err.错误:已关闭

问题描述 投票:0回答:4

我正在尝试创建一个登录功能。但它只起作用。例如-当我提供错误的用户名和密码时,我收到正确的错误消息,在取消该消息并提供正确的用户名和密码后,我收到“无法登录”,然后我收到“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()
python pycharm web.py
4个回答
3
投票

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

一个解决办法是移动你的:

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
块。
    


3
投票

finally: connection.close()

根据文档:
“无论是否发生异常,finally 子句总是在离开 try 语句之前执行”
来自:
https://docs.python.org/2/tutorial/errors.html

您没有描述您希望看到发生的替代行为,但我的回答解决了您问题的症结。


0
投票


0
投票

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"

	
© www.soinside.com 2019 - 2024. All rights reserved.