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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:43:12