В настоящее время я пишу небольшую структуру базы данных для проекта, где я использую пользовательскую реализацию временных таблиц, создавая новые таблицы и удаляя их при завершении. Я делаю это, сохраняя отношение 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 отслеживает ссылки.