Domanda

Devo occuparmi di un ampio set di risultati (potrebbero essere centinaia di migliaia di righe, a volte di più).
Devono purtroppo essere recuperati tutti in una volta (all'avvio).

Sto provando a farlo usando meno memoria possibile.
Guardando SO ho scoperto che usare SSCursor potrebbe essere quello che sto cercando, ma non so ancora come usarli esattamente.

Fare un fetchall () da un cursore di base o uno SScursor è lo stesso (in termini di utilizzo della memoria)?
Posso "trasmettere" dallo script le mie righe una alla volta (o alcune a poche) e se sì,
qual è il modo migliore per farlo?

È stato utile?

Soluzione

Sono d'accordo con la risposta di Otto Allmendinger, ma per rendere esplicito il commento di Denis Otkidach, ecco come puoi iterare sui risultati senza usare la funzione fetch () di Otto:

import MySQLdb.cursors
connection=MySQLdb.connect(
    host="thehost",user="theuser",
    passwd="thepassword",db="thedb",
    cursorclass = MySQLdb.cursors.SSCursor)
cursor=connection.cursor()
cursor.execute(query)
for row in cursor:
    print(row)

Altri suggerimenti

Usa sicuramente SSCursor per recuperare grandi set di risultati. Ha fatto un'enorme differenza per me quando ho avuto un problema simile. Puoi usarlo in questo modo:

import MySQLdb
import MySQLdb.cursors

connection = MySQLdb.connect(
        host=host, port=port, user=username, passwd=password, db=database, 
        cursorclass=MySQLdb.cursors.SSCursor) # put the cursorclass here
cursor = connection.cursor()

Ora puoi eseguire la tua query con cursor.execute () e usare il cursore come iteratore.

Modifica : rimosso iteratore interno inutile, grazie Denis!

In alternativa, puoi usare SSCursor all'esterno dell'oggetto connessione (è piuttosto importante quando definisci già la connessione e non vuoi che tutta la connessione usi SSCursor come classe di cursore).

import MySQLdb
from MySQLdb.cursors import SSCursor # or you can use SSDictCursor

connection = MySQLdb.connect(
        host=host, port=port, user=username, passwd=password, db=database)
cursor = SSCursor(connection)
cursor.execute(query)
for row in cursor:
    print(row)   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top