2017-04-04 3 views
0

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.

Répondre

0

Lorsque vous devez vous connecter à la base de données, vous avez besoin de quelque chose comme un curseur. Vous avez besoin d'un objet curseur pour extraire les résultats.

Dans l'exemple de programme lorsque vous exécutez la boucle dans la plage (4), il appelle execQuery(). En regardant dans la définition, vous pouvez trouver def execQuery(cursor=getCursor()): la fonction prend l'entrée en tant que curseur et par défaut il a utilisé getCursor() fonction qui crée tout le curseur lorsque la boucle est exécutée. Pendant que vous êtes dans votre programme, vous fermez le curseur mais vous ne le créez pas, donc quand la deuxième requête d'exécution arrive, aucun curseur n'est présent et le programme renvoie une erreur.

+0

Merci pour votre réponse. Je pense que 'la fonction qui crée tout le curseur quand ...' devrait être 'curseur' à chaque fois * ', non? – user3290525

+0

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