如何在Python类方法间传递数据库连接对象?代码报错求助
Python MySQL数据库操作代码的问题修复
原始代码
from abc import ABC,abstractmethod import mysql.connector class Database(ABC): @abstractmethod def establishingconnection(self): pass @abstractmethod def executequery(self): pass @abstractmethod def closingconnection(self): pass class sqlDatabase(Database): def establishingconnection(self): conn = mysql.connector.connect( host="localhost", user="root", password="Preethi@123", database="naveent" ) if conn.is_connected()==True: print("Connected to Database") else: print("Unable to connect") print("----------------------------------------") return conn def executequery(conn): conn=conn.establishingconnection() mycursor=conn.cursor() mycursor.execute("SELECT*FROM studentinfo WHERE Address='Chittoor'") a=mycursor.fetchall() for x in a: print(x) print("-------------------------------------------") def closingconnection(conn): conn=conn.establishingconnection() conn.close() print("After using close") if not conn.is_connected()==True: print("connection is closed") obj=sqlDatabase() obj.establishingconnection() obj.executequery() obj.closingconnection()
存在的问题
- 调用
closingconnection时会重新创建连接再关闭,没有复用已建立的连接 - 方法参数错误,导致调用时出现属性不存在的报错
问题根源
- 类实例方法参数错误:Python中类的实例方法第一个参数必须是
self(代表实例本身),你用conn代替self,导致调用时实例对象被传入这个参数,后续代码里的conn=conn.establishingconnection()逻辑混乱,相当于让实例重新创建连接覆盖参数。 - 未复用连接对象:每次调用方法都重新调用
establishingconnection创建新连接,没有把连接保存为实例的属性,导致无法复用已有连接,关闭操作也只针对新创建的连接。
修正后的代码
from abc import ABC, abstractmethod import mysql.connector class Database(ABC): @abstractmethod def establishingconnection(self): pass @abstractmethod def executequery(self): pass @abstractmethod def closingconnection(self): pass class sqlDatabase(Database): def __init__(self): # 初始化实例属性,用于保存数据库连接 self.conn = None def establishingconnection(self): self.conn = mysql.connector.connect( host="localhost", user="root", password="Preethi@123", database="naveent" ) if self.conn.is_connected(): print("Connected to Database") else: print("Unable to connect") print("----------------------------------------") def executequery(self): # 先检查连接状态,避免操作无效连接 if not self.conn or not self.conn.is_connected(): print("请先建立数据库连接") return mycursor = self.conn.cursor() mycursor.execute("SELECT * FROM studentinfo WHERE Address='Chittoor'") a = mycursor.fetchall() for x in a: print(x) print("-------------------------------------------") def closingconnection(self): if self.conn and self.conn.is_connected(): self.conn.close() print("After using close") if not self.conn.is_connected(): print("connection is closed") else: print("连接未建立或已关闭") # 调用示例 obj = sqlDatabase() obj.establishingconnection() obj.executequery() obj.closingconnection()
核心修正点
- 添加
__init__方法初始化实例属性self.conn,统一保存数据库连接对象 - 所有实例方法使用
self作为第一个参数,通过self.conn复用同一连接 establishingconnection不再返回连接,直接赋值给实例属性executequery和closingconnection增加连接状态检查,避免无效操作- 关闭方法仅针对已建立的连接操作,不会重新创建新连接
内容的提问来源于stack exchange,提问作者naveen
相关产品推荐
相关产品推荐

