Подтвердить что ты не робот

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()
4b9b3361

Ответ 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 шагов

  1. Создать соединение
  2. Создать курсор
  3. Создать строку запроса
  4. Выполнить запрос
  5. Подтвердить запрос
  6. Закрыть курсор
  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, но является частой структурой данных в самих базах данных.

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