Python MySQL Connector de l'exécution de la deuxième instruction sql à l'intérieur du curseur de la boucle?
La logique suivante fonctionne avec le module mysqldb (voir python mysqldb plusieurs curseurs pour une connexion), mais j'obtiens l'erreur suivante avec mysql.connecteur cursor2.execute(sql)
"Non lus résultat trouvé."
Je me rends compte que je peux utiliser une jointure de combiner ces 2 simples instructions sql et d'éviter la nécessité d'un deuxième curseur, mais mon exemple dans la réalité est plus complexe et nécessite une deuxième instruction sql.
En supposant que j'en ai besoin pour exécuter séparer les 2 instructions sql (1 pour la boucle et 1 à l'intérieur de la boucle), comment cela doit être fait avec mysql.connecteur de module?
import datetime
import mysql.connector
db = mysql.connector.connect(user='alan', password='please', host='machine1', database='mydb')
cursor1 = db.cursor()
cursor2 = db.cursor()
sql = """
SELECT userid,
username,
date
FROM user
WHERE date BETWEEN %s AND %s
"""
start_date = datetime.date(1999, 1, 1)
end_date = datetime.date(2014, 12, 31)
cursor1.execute(sql, (start_date, end_date))
for (userid, username, date) in cursor1:
sql = """
select count(*)
from request
where assigned = '%s'
""" % (userid)
cursor2.execute(sql)
requestcount = cursor2.fetchone()[0]
print userid, requestcount
cursor2.close()
cursor1.close()
db.close()
Ce mysqldb version fonctionne très bien:
import datetime
import MySQLdb
db = MySQLdb.connect(user='alan', passwd='please', host='machine1', db='mydb')
cursor1 = db.cursor()
cursor2 = db.cursor()
sql = """
SELECT userid,
username,
date
FROM user
WHERE date BETWEEN %s AND %s
"""
start_date = datetime.date(1999, 1, 1)
end_date = datetime.date(2014, 12, 31)
cursor1.execute(sql, (start_date, end_date))
for (userid, username, date) in cursor1:
sql = """
select count(*)
from request
where assigned = '%s'
""" % (userid)
cursor2.execute(sql)
requestcount = cursor2.fetchone()[0]
print userid, requestcount
cursor2.close()
cursor1.close()
db.close()
OriginalL'auteur panofish | 2014-04-07
Vous devez vous connecter pour publier un commentaire.
MySQL Connector/Python est, par défaut, la non-mise en mémoire tampon. Cela signifie que les données ne sont pas récupérées automatiquement et vous avez besoin de 'consommer' tous lignes. (Il fonctionne avec MySQLdb parce que le pilote est mise en mémoire tampon par défaut.)
À l'aide de Connecteur/Python, vous devez utiliser le tampon-argument à True pour le curseur, vous utilisez comme un itérateur. Dans le cas des OP question, ce serait
cursor1
:Vous pouvez également utiliser
buffered=True
que la connexion argument pour faire tout le curseur de mise en mémoire tampon instancié par cette connexion de mise en mémoire tampon.À mon humble avis, pas de mise en mémoire tampon par défaut est plus sûr lors de l'extraction de beaucoup de données. Quand je sais il n'y aura que peu de résultats, je me tourne sur le tampon. Cela ne changera pas dans le Connecteur/Python.
Merci encore Geert! Voulais juste comprendre. 🙂
Malheureusement
buffered=True
ne peut pas être combiné avecprepared=True
-- "ValueError: le Curseur ne sont pas disponibles avec les critères donnés: mise en mémoire tampon, préparé"OriginalL'auteur geertjanvdk