【问题标题】:Why is my Python mysql class __init__ function trying to overload the mysql package __init__ function?为什么我的 Python mysql 类 __init__ 函数试图重载 mysql 包 __init__ 函数?
【发布时间】:2020-04-09 11:55:12
【问题描述】:

我想为我的 python 脚本创建一个简单的 mysql 连接类。 script.py中类的预期用途:

import db_connection

db = db_connection.DBConnection()
db.get_cursor()

类本身在脚本db_connect.py:

import mysql.connector

class DBConnection:

def __init__(self):
    self.__host="192.168.1.22"
    self.__port="3306"
    self.__user="somename"
    self.__passwd="somepw"
    self.__database="mydbname"

def __connect(self):
    con = mysql.connector.connect(
    self.__host,
    self.__port,
    self.__user,
    self.__passwd,
    self.__database
    )

    print("connected.")
    return con

def get_cursor(self):
    con = self.__connect()
    cursor = con.cursor(dictionary=True)
    return cursor

我收到以下错误:

Traceback (most recent call last):
  File "C:/.../script.py", line 14, in <module>
    db.get_cursor()
  File "C:\...\db_connection.py", line 26, in get_cursor
    con = self.__connect()
  File "C:\...\db_connection.py", line 13, in __connect
    con = mysql.connector.connect(
  File "C:\...\Python\Python38-32\lib\site-packages\mysql\connector\__init__.py", line 219, in connect
    return MySQLConnection(*args, **kwargs)
  File "C:\...\Python\Python38-32\lib\site-packages\mysql\connector\connection.py", line 64, in __init__
    super(MySQLConnection, self).__init__(*args, **kwargs)
TypeError: __init__() takes 1 positional argument but 6 were given

Process finished with exit code 1

我的类中的 init 函数和 mysql 包 init 函数似乎存在问题。我在 Python 方面太不熟练了,无法理解我做错了什么,因此非常感谢您的帮助。

【问题讨论】:

    标签: python mysql oop


    【解决方案1】:

    毫无疑问,您班级的__init__ 方法隐藏了MySQLConnection 的方法。问题是您将参数作为位置参数传递,而 mysql.connector.connect 要求它们作为关键字参数传递,例如:

    con = mysql.connector.connect(
        host=self.__host,
        port=self.__port,
        user=self.__user,
        password=self.__passwd,
        database=self.__database
    )
    

    你也可以参考一些examples的文档。

    正如 Matthias 所指出的,这里不需要两个前导下划线(在普通用户编写的代码中很少需要)。要将这些变量标记为类的内部变量,您通常会使用单个下划线,即:

    def __init__(self):
        self._host="192.168.1.22"
        self._port="3306"
        self._user="somename"
        self._passwd="somepw"
        self._database="mydbname"
    

    你得到一个进一步的错误

    ReferenceError: 弱引用对象不再存在

    因为您的连接只是暂时的,并且存在于您的 get_cursor 方法的范围内。连接在该方法结束时关闭。您可以通过将连接存储在您的类上来解决此问题,该类保留对打开连接的引用,例如:

    class DBConnection:
    
        def __init__(self):
            self._host="192.168.1.22"
            self._port="3306"
            self._user="somename"
            self._passwd="somepw"
            self._database="mydbname"
            self.con = None
    
        def _connect(self):
            self.con = mysql.connector.connect(
                host=self._host,
                port=self._port,
                user=self._user,
                password=self._passwd,
                database=self._database
            )
    
            print("connected.")
    
        def get_cursor(self):
            if not self.con:
                self._connect()
            return self.con.cursor(dictionary=True)
    

    有关此ReferenceError 的更多详细信息,请参阅What does it mean "weakly-referenced object no longer exists"?

    【讨论】:

    • 顺便说一句,前两个下划线似乎有点矫枉过正。如果要标记属性供内部使用,一个前导下划线就足够了。
    • @Matthias 我已更新我的答案以包含此内容。
    • 谢谢,解决了_connect函数的问题。但是,现在,当使用 db_connect 对象,获取光标并对其运行查询时,我收到此错误:ReferenceError: weakly-referenced object no longer exists:db = db_connection.DBConnection() cursor = db.get_cursor() cursor.execute("SELECT * from tablea;")
    • @Siedler 请看我的编辑。您收到此错误是因为您的连接在您的 get_cursor 方法完成执行后关闭。这是因为游标只持有对底层连接的弱引用。
    猜你喜欢
    • 2023-01-16
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2020-08-16
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多