Gestionnaire de contexte pour Python MySQLdb
Je suis habitué (gâté par?) python SQLite interface pour gérer des bases de données SQL. Une fonctionnalité intéressante en python SQLite de l'API le "gestionnaire de contexte," c'est à dire, python with
déclaration. J'ai l'habitude d'exécuter des requêtes de la manière suivante:
import as sqlite
with sqlite.connect(db_filename) as conn:
query = "INSERT OR IGNORE INTO shapes VALUES (?,?);"
results = conn.execute(query, ("ID1","triangle"))
Avec le code ci-dessus, si ma requête modifie la base de données et j'ai oublier d'exécuter conn.commit()
,le gestionnaire de contexte qu'il exécute automatiquement pour moi à la sortie de l' with
déclaration. Il gère aussi des exceptions bien: si une exception se produit avant que je m'engage à rien, puis la base de données est restaurée.
Je suis maintenant en utilisant la MySQLdb
interface, ce qui ne semble pas soutenir un contexte similaire gestionnaire de la boîte. Comment puis-je créer mon propre? Il y a une question relative à la ici, mais il n'offre pas une solution complète.
Vous devez vous connecter pour publier un commentaire.
Auparavant, MySQLdb connexions étaient contexte gestionnaires.
Comme de ce commit sur 2018-12-04, cependant, MySQLdb les connexions ne sont plus contexte, les gestionnaires, les
et les utilisateurs doivent appeler explicitement conn.commit() ou conn.rollback(), ou d'écrire leur propre gestionnaire de contexte, comme celui ci-dessous.
Vous pouvez utiliser quelque chose comme ceci:
Pour l'utiliser, il serait lieu
config.py
dans votre PYTHONPATH et de définir le HOST, USER, PASS, MYDB variables.__exit__
fonction suppose queself.connection
existe. Si vous instanciez la connexion dans le__enter__
fonction et il soulève une exception, le__exit__
fonction de soulever une exception à la règle puisqu'il n'y aurait pas deconnection
appelerrollback
oucommit
sur. Donc non, il ne serait pas plus sûr.__enter__
. Voir aussi ce doc exemple.contextlib.contextmanager
décorateur au lieu de définir__enter__
et__exit__
explicitement, car il rend le code plus court et plus lisible.Pense que les choses ont changé depuis que cette question a été initialement demandé. Un peu prêter à confusion (de mon point de vue au moins), pour les versions récentes de
MySQLdb
, si vous utilisez une connexion dans un contexte que vous obtenez un curseur (comme par leoursql
exemple), pas quelque chose qui se ferme automatiquement (comme vous le feriez si vous avez ouvert un fichier par exemple).Voici ce que je fais: