Здесь у вас есть действительная основополагающая проблема, однако также важно понять, как работает sqlite:
1. connection open
2. transaction started
3. statement executes
4. transaction done
5. connection closed
с точки зрения правильности данных , вам нужно беспокоиться только о транзакциях, а не об открытых дескрипторах. sqlite только блокирует базу данных внутри транзакции (*) или выполнения оператора.
однако с точки зрения управления ресурсами , например если вы планируете удалить файл sqlite или использовать так много соединений, что у вас могут не хватить файловых дескрипторов, вам не безразличны и открытые соединения вне транзакции.
существует два способа закрытия соединения: либо вы вызываете .close()
явно, после чего у вас все еще есть дескриптор, но не можете его использовать, либо вы позволяете соединению выйти из области видимости и получить сборщик мусора.
если вы должны закрыть соединение , закройте его явно, согласно девизу Python " явно лучше, чем неявное ."
Если вы проверяете код только на наличие побочных эффектов, выход последней переменной, содержащей ссылку на соединение, может быть приемлемым, но имейте в виду, что исключения захватывают стек, и, следовательно, ссылки в этом стеке. если вы передаете исключения, время жизни соединения может быть произвольно продлено.
caveat programmator , sqlite по умолчанию использует «отложенные» транзакции, то есть транзакция начинается только при выполнении оператора. В приведенном выше примере транзакция выполняется с 3 до 4, а не с 2 до 4.