You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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时会重新创建连接再关闭,没有复用已建立的连接
  • 方法参数错误,导致调用时出现属性不存在的报错

问题根源

  1. 类实例方法参数错误:Python中类的实例方法第一个参数必须是self(代表实例本身),你用conn代替self,导致调用时实例对象被传入这个参数,后续代码里的conn=conn.establishingconnection()逻辑混乱,相当于让实例重新创建连接覆盖参数。
  2. 未复用连接对象:每次调用方法都重新调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:23:39