Правильная работа с закрытым соединением с помощью pymysql

#mysql #python-3.7 #pymysql

#mysql #python-3.7 #pymysql

Вопрос:

Я создаю класс для унификации способа работы с базой данных, и я хочу убедиться, что соединение закрыто, когда объект больше не используется, класс выглядит примерно так:

 import pymysql

class MyContainerdbclass:

    def __init__():
     self.connection = pymysql.connect(.....)
    
    def foo():
        ...

    def __del__(self):
        self.connection.close()
  

Это работает довольно хорошо, но когда программа завершилась, я получил раздражающее предупреждение:

 Traceback (most recent call last):
  File "...../mysql.py", line 12, in __del__
  File "...../python3.7/site-packages/pymysql/connections.py", line 359, in close
TypeError: 'NoneType' object is not callable
  

Я только что добавил try / except, чтобы избежать этого, но я не очень уверен, безопасно ли это.

 def __del__(self):
    try:
        self.connection.close()
    except TypeError:
        pass
  

Насколько я мог судить, при уничтожении этого объекта открытых соединений не осталось. Дайте мне знать, если вы согласны с этим подходом.

Комментарии:

1. Вы не хотите этого делать. Соединение всегда должно быть локальной переменной в каждом методе, который использует один, выделенный при входе и закрытый через все возможные пути выхода. То же самое с операторами и наборами результатов. В противном случае вы столкнетесь с живучестью, безопасностью потоков и многими другими проблемами.

2. Ну, основная проблема, с которой я столкнулся, заключалась в том, что открытые соединения были распределены по разным сценариям. Этот класс используется как отдельный объект в остальной части кода, поэтому независимо от того, какой скрипт вызывает этот объект, с помощью этого метода я удостоверяюсь, что соединение закрыто в конце программы.

3. Но теперь вы должны убедиться, что объект уничтожен. Нет никаких преимуществ, и все недостатки, о которых я упоминал, и многое другое.

4. Не совсем, в этом смысл использования __del__ , сборщик мусора позаботится об этом.

5. Вы не хотите полагаться на сборку мусора для закрытия соединений. Вы хотите сделать это самостоятельно, вручную, как можно скорее. чтобы избежать перегрузки сервера. И, конечно, соединение все равно закроется при сборке мусора?