Python MySQLdb: connection.close() VS. cursor.close()
Если я использую MySQLdb для подключения к MySQL-серверу через Python. Я создаю connection
и cursor
как это:
connection = MySQLdb.connect(...)
cursor = connection.cursor()
# process
Когда MySQL-обработка завершена, нужно закрыть connection
. Теперь мне было интересно: достаточно ли закрыть connection
, выполнив:
connection.close()
или я должен сначала закрыть cursor
а затем connection
? Как это:
cursor.close()
connection.close()
Ответы
Ответ 1
Используйте with
, этот инструмент позволяет вам создать временный курсор, который будет закрыт, как только вы вернетесь к своему предыдущему уровню отступа.
from contextlib import closing
with closing( connection.cursor() ) as cursor:
(indented) use the cursor
(non-indented) cursor is closed.
connection.close()
Ответ 2
Закрытие курсора, как только вы закончите с ним, вероятно, лучший выбор, так как вы больше не используете его. Тем не менее, я не видел ничего, где было бы опасно закрыть его после подключения db. Но поскольку вы можете установить его как:
cursor = conn.cursor()
Я рекомендую закрыть его раньше, в случае, если вы случайно присвоите его снова, и соединение с БД будет закрыто, поскольку это вызовет ошибку. Поэтому вы можете закрыть его сначала, чтобы предотвратить случайное переназначение с закрытым соединением.
(Некоторые даже не закрывают его вообще, хотя он собирает сборщик мусора (см. В Python с sqlite необходимо закрыть курсор?))
Литература:
Когда закрывать курсоры с помощью MySQLdb
В Python с sqlite необходимо закрыть курсор?
Ответ 3
Закрытие соединения должно быть достаточно хорошим в этом конкретном контексте.
Если вы работаете с несколькими курсорами и т.д., Вам нужно заботиться о правильном управлении ресурсами.
Ответ 4
Я буду повторять лучшие практики для всех, кто сталкивается с SQL-соединением, использующим MySQLdb или любой другой пакет для подключения, python2/3 должен знать это
(В следующем прогоне предполагается, что в вашей базе данных sql есть таблица с именем tablename. В ней есть 4 столбца/поля с именами field1, field2, field3, field4). Если ваше соединение локальное (на той же машине), то оно 127.0.0.1, также известное как "localhost".
Процесс должен быть простым 7 шагов
- Создать соединение
- Создать курсор
- Создать строку запроса
- Выполнить запрос
- Подтвердить запрос
- Закрыть курсор
- Закрыть соединение
Вот простой шаг за рулем
mydb = MySQLdb.connect(host=host, user=user, passwd=passwd, db=database, charset="utf8")
cursor = mydb.cursor()
query = "INSERT INTO tablename (text_for_field1, text_for_field2, text_for_field3, text_for_field4) VALUES (%s, %s, %s, %s)"
cursor.execute(query, (field1, field2, field3, field4))
mydb.commit()
cursor.close()
mydb.close()
Связь и курсор разные. соединение находится на уровне SQL, а курсор может рассматриваться как элемент данных. Вы можете иметь несколько курсоров для одних и тех же данных в одном соединении. Это необычное явление - иметь несколько подключений к одним и тем же данным с одного компьютера.
Более подробно описано здесь: "Парадигма курсора не является специфичной для Python, но является частой структурой данных в самих базах данных.
В зависимости от базовой реализации может быть возможно сгенерировать несколько курсоров, совместно использующих одно и то же соединение с базой данных. Закрытие курсора должно освободить ресурсы, связанные с запросом, включая любые результаты, которые никогда не извлекаются из БД (или извлекаются, но не используются), но не устраняют соединение с самой базой данных, поэтому вы сможете получить новый курсор в той же базе данных. без необходимости повторной аутентификации. "