Почему моя функция Python mysql class __init__ пытается перегрузить функцию __init__ пакета mysql? - PullRequest
0 голосов
/ 09 апреля 2020

Я хотел бы создать простой mysql класс соединения для моих python скриптов. Предполагаемое использование класса в 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 package init . Я слишком неквалифицирован в Python, чтобы понять, что я делаю неправильно, поэтому ваша помощь очень ценится.

1 Ответ

2 голосов
/ 09 апреля 2020

Нет вопроса о методе __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 .

Как указал Маттиас, здесь не требуется двух ведущих подчеркиваний (редко требуется в коде, который пишут обычные пользователи). Чтобы пометить эти переменные как внутренние для вашего класса, вы обычно используете одно подчеркивание, например:

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

Вы получаете дополнительную ошибку

ReferenceError: объект со слабой ссылкой no существует дольше

, поскольку ваше соединение является только временным и существует в рамках вашего метода 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 можно найти в Что это значит "объект со слабой ссылкой больше не существует"? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...