Ceci est l'échantillon reproduit:Python MySQL exécuter boucle de requête avec le curseur près
import mysql.connector
conn = mysql.connector.connect(
user='root', password='12347',
host='localhost')
def getCursor():
return conn.cursor()
def execQuery(cursor=getCursor()):
cursor.execute("SELECT 2")
cursor.fetchall()
cursor.close()
for i in range(4):
cursor = execQuery()
Ce code fonctionne sans cursor.close()
. Mais ce que je trouve bizarre est que cet exemple fonctionne même avec cursor.close() avec un simple changement:
def execQuery():
cursor=getCursor()
cursor.execute("SELECT 2")
cursor.fetchall()
cursor.close()
En déplaçant le paramètre par défaut au corps de la fonction.
Je ne sais pas si c'est la meilleure pratique pour fermer le curseur, donc je peux sauter le curseur de fermeture tout en gardant la première forme. Si ce n'est pas la meilleure pratique d'avoir un paramètre par défaut qui utilise la valeur de retour d'une fonction, je peux aller avec le second formulaire. Mais je veux pourquoi ils agissent différemment
Il est comme si je vais avoir la même erreur que:
cursor.execute("SELECT 2")
cursor.fetchall()
cursor.close()
cursor.execute("SELECT 2")
Il est comme chaque appel de ExecQuery utilise le même curseur, il est bloqué juste au deuxième appel.
Merci pour votre réponse. Je pense que 'la fonction qui crée tout le curseur quand ...' devrait être 'curseur' à chaque fois * ', non? – user3290525
Quoi qu'il en soit, d'après ce que je comprends de votre réponse, chaque fois que 'execQuery' est appelé dans la boucle, il crée un curseur. Ensuite, vous dites que je ferme le curseur et ne le crée pas à nouveau. Voulez-vous dire que lorsque le 'execQuery' est exécuté la deuxième fois, le curseur n'est pas créé, parce qu'il était fermé? Pouvez-vous s'il vous plaît me dire pourquoi il n'est pas créé à nouveau s'il vous plaît? – user3290525