Python MySQL коннектор: ReferenceError при запуске cursor.execute () при уничтожении объекта - PullRequest
0 голосов
/ 03 августа 2020

В настоящее время я пишу небольшую структуру базы данных для проекта, где я использую пользовательскую реализацию временных таблиц, создавая новые таблицы и удаляя их при завершении. Я делаю это, сохраняя отношение 1 к 1 между таблицей БД и представляющим ее объектом, а затем отбрасывая ее с запросом при уничтожении этого объекта в методе __del__().

Я использую следующий код для этого:

class Table:
    def __init__(self, database: Database, schema: TableSchema, is_temporary: bool = False):
        self.database = database
        self.schema = schema
        self.is_temporary = is_temporary

    def __del__(self):
        print(f"Destroying table {self.schema.name}.")
        if self.is_temporary:
            self.database.drop_table(self.schema)
            print(f"Dropped table {self.schema.name}.")

Класс Database также содержит соединение и курсор. Кроме того, класс Database содержит метод drop_table, определенный как:

def query(self, query_text: str):
    self.cursor.execute(query_text)
    try:
        return self.cursor.fetchall()
    except InterfaceError:
        pass  # If query yields no results, don't return any

def drop_table(self, schema: TableSchema):
    self.query(f"DROP TABLE {schema.name}")

метод запроса - это просто метод-оболочка вокруг self.cursor.execute(...).

Это дает мне следующее исключение (заменяя мою личную информацию на <...>):

Exception ignored in: <function Table.__del__ at 0x7fc56f04a310>
Traceback (most recent call last):
  File "<...>/table.py", line 16, in __del__
  File "<...>/database.py", line 83, in drop_table
  File "<...>/database.py", line 30, in query
  File "<...>/venv/lib/python3.8/site-packages/mysql/connector/cursor_cext.py", line 232, in execute
ReferenceError: weakly-referenced object no longer exists

Вызов метода выпадающей таблицы вручную работает как шарм и, как и ожидалось. Есть ли способ сохранить (внутренние) объекты, необходимые для работы execute(), до тех пор, пока все ссылки курсора не будут уничтожены? У меня сложилось впечатление, что python отслеживает ссылки.

...