En Python, avec sqlite est-il nécessaire de fermer un curseur?
Voici le scénario. Dans votre fonction, vous êtes l'exécution des instructions à l'aide d'un curseur, mais l'un d'eux échoue et une exception est levée. Votre programme les sorties de la fonction avant de fermer le curseur, il a été de travailler avec. Va le curseur flotter autour de la prise de l'espace? Dois-je fermer le curseur?
En outre, la documentation Python est un exemple de l'utilisation du curseur et dit: "nous aussi Nous pouvons fermer le curseur si on a terminé." Le mot-clé étant "peut" et non "doivent". Que veulent-ils dire exactement par là?
Vous devez vous connecter pour publier un commentaire.
C'est probablement une bonne idée (bien qu'il pourrait ne pas beaucoup d'importance avec sqlite, je ne sais pas là, mais ça va rendre votre code plus portable). De plus, avec la récente de Python (2.5+), c'est facile:
Vous n'êtes obligé à appeler
close()
sur le curseur; elle peut être nettoyée comme tout autre objet.Mais même si l'attente pour la collecte des ordures sons OK, je pense qu'il serait bon style encore pour s'assurer qu'une ressource telle qu'une base de données curseur se ferme s'il existe ou non une exception.
Je n'ai pas vu d'effet pour la
sqlite3.Cursor.close()
fonctionnement.Après la fermeture, vous pouvez toujours appeler
fetch(all|one|many)
qui vous permettra de revenir le reste des résultats de la précédente instruction execute. Même en cours d'exécutionCursor.execute()
fonctionne encore ...Fait intéressant, le Python 3.0 doc dit "nous aussi Nous pouvons fermer le curseur si on a terminé", tandis que le Python 2.7 et 3.6 doc a dit "Nous pouvons aussi fermer la connexion si on a terminé".
Le Python 2.7 et 3.0-3.4 documents ne décrivent pas le curseur
.close()
méthode. Mais le Python 3.5 et 3.6 docs décrire la curseur.close()
méthode:Ce code permet de fermer automatiquement le
Cursor
. Il permettra également de fermer automatiquement et à engager lesConnection
.Tous,
J'ai été confronté à un graduelle de fuite de mémoire avec mon code (Python 3.8) à l'aide de sqlite3. J'ai tracé la cause probable de mes classes de base de données. Comme il s'avère, je voudrais ouvrir et utiliser un curseur, mais jamais fermé. La base de données est restée ouverte pendant la durée du programme (Service Windows) et sera fermée à la sortie.
Une fois que j'ai commencé à la fermeture de la curseurs dans tous mes db opérations qui, ma mémoire fuite s'est arrêtée, et l'empreinte mémoire est devenue stable.
Je suggérerais donc que vous preniez le temps de fermer vos curseurs. Elle rend le code plus cohérente et apparemment, aide à contrôler la mémoire consommée.
Voici un exemple de la façon dont j'ai fermer le curseur: