Python自定义MySQL连接类报错:__init__参数不匹配问题求助
解决MySQL Connector连接时的TypeError问题
嘿,这个错误跟你想的完全不一样——根本不是自定义类重载了MySQL的__init__函数,问题出在你调用mysql.connector.connect()的方式上!
错误原因分析
你在__connect方法里直接把host、port这些参数按位置传递给connect(),但mysql.connector.connect()并不支持这种方式。它的构造函数只接受1个位置参数(可选的配置字典),剩下的都需要用关键字参数来指定。你直接传了5个位置参数,加上函数调用时隐含的参数,就导致MySQL的连接类收到了6个它不期待的位置参数,于是抛出了TypeError: __init__() takes 1 positional argument but 6 were given。
另外还要注意一个细节:你用的变量名是__passwd,但MySQL Connector的参数名是password,不是passwd,这也是个容易踩的坑!
修复方案
方案1:使用关键字参数传递(最直观)
修改你的__connect方法,明确指定每个参数的名称:
def __connect(self): con = mysql.connector.connect( host=self.__host, port=self.__port, user=self.__user, password=self.__passwd, # 这里要写成password,不是passwd database=self.__database ) print("connected.") return con
方案2:用字典包装参数再解包(更整洁)
如果参数比较多,把它们放进字典里,用**解包传递会更清晰:
def __connect(self): db_config = { "host": self.__host, "port": self.__port, "user": self.__user, "password": self.__passwd, "database": self.__database } con = mysql.connector.connect(**db_config) print("connected.") return con
额外优化:避免连接泄漏
你的现有代码还有个潜在问题:每次调用get_cursor()都会新建一个数据库连接,用完后没有关闭,时间长了会导致连接堆积。这里给你优化一下类,让它复用连接并支持手动关闭:
import mysql.connector from mysql.connector import Error class DBConnection: def __init__(self): self.__host="192.168.1.22" self.__port="3306" self.__user="somename" self.__passwd="somepw" self.__database="mydbname" self.__connection = None self.__cursor = None def __connect(self): # 只有当连接不存在或已断开时才重新连接 if not self.__connection or not self.__connection.is_connected(): try: self.__connection = mysql.connector.connect( host=self.__host, port=self.__port, user=self.__user, password=self.__passwd, database=self.__database ) print("数据库连接成功.") except Error as e: print(f"连接失败: {str(e)}") raise # 抛出错误让上层处理 return self.__connection def get_cursor(self): if not self.__cursor or not self.__connection.is_connected(): self.__connect() self.__cursor = self.__connection.cursor(dictionary=True) return self.__cursor def close(self): # 关闭游标和连接 if self.__cursor: self.__cursor.close() if self.__connection and self.__connection.is_connected(): self.__connection.close() print("数据库连接已关闭.")
使用的时候记得在脚本最后调用db.close()来释放资源,或者用上下文管理器(with语句)来自动管理连接。
内容的提问来源于stack exchange,提问作者Siedler
相关产品推荐
相关产品推荐

