Connexions multiples Python - Mysql
Bonjour à tous,
Après pas mal d'années à joongler entre C++, Perl, PHP et leur lib Mysql respectives. Je me met aujourd"hui à Python avec la lib mysql-python qui est basée sur l'API Mysql C.
Voilà pour l'intro.
Mon objectif c'est de créer un programme de nettoyage d'une énorme base de donnée, en évitant si possible que le programme se suce allègrement toute la mémoire du serveur. Et là c'est plus compliqué...
Je m'explique par le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
def testData(self):
print "On affiche toutes les valeurs qui vont être modifiées"
# On observe tous les tuples concernés dans la table Document
cursorDoc = self.dbConnect.cursor(cursors.SSCursor)
queryDoc = "SELECT DocKey FROM Document WHERE Date < '20080101' "
cursorDoc.execute(queryDoc)
for (docKey,) in cursorDoc:
# On compte le nombre d'éléments qui vont être supprimés dans les tables liées
cursorCnt = cursor(cursors.SSCursor)
tables = ("Tracing", "DocPage", "SubscriberDoc", "Document")
for table in tables:
queryCnt = "SELECT count(*) FROM %s WHERE DocKey = '%s' " % (table, docKey)
cursorCnt.execute(queryCnt)
print cursorCnt
cursorCnt.close()
cursorDoc.close() |
et la réponse à l'exécution :
Citation:
Envoyé par python CLI
File "PurgeCB2.py", line 55, in testData
cursorCnt.execute(queryCnt)
File "build/bdist.linux-i686/egg/MySQLdb/cursors.py", line 166, in execute
File "build/bdist.linux-i686/egg/MySQLdb/connections.py", line 35, in defaulterrorhandler
_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")
Exception _mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now") in <bound method SSCursor.__del__ of <MySQLdb.cursors.SSCursor object at 0x403254ec>> ignored
Et bien j'ai l'honneur de vous apprendre que ce code ne fonctionne pas car :
"You can't really have multiple cursors on the same connection at the same
time."
Traduction : c'est impossible d'avoir plusieurs curseurs en même temps.
C'est une limitation de l'api Mysql-C sur laquelle est basé python-mysql.
A noter que j'utilise des SSCursor qui conservent le résultat côté serveur ce qui est à l'origine du problème. Mais si je veux éviter de faire enfler ma mémoire, je fais comment ?
Si vous avez des idées je suis preneur...
Merci,
Ercete