[Python] next record in mysqldb

Y3s y3s a katamail.com
Lun 1 Ott 2007 15:38:13 CEST


Il giorno 01/ott/07, alle ore 11:44, Paolo Amodio ha scritto:

> Buon giorno a tutti.
> Una breve domanda.
> Eseguita una query e ritornati i risultati ho la necessità di  
> avanzare, o retrocedere, di un record (i risultati popolano dei  
> campi in wxPython).
> Attualmente e per il momento ho creato una funzione che, ricevuto  
> il valore attuale del record (in realtà del campo ID), effettua una  
> nuova query.
> Il sistema mi sembra macchinoso.
> Esiste qualche cosa di migliore?

Retrocedere, nel caso generale non puoi. Poi qualche modulo potrebbe  
anche implementare un cursore "a doppio senso", ma non credo sia  
standard dbapi2. Dovresti quindi implementare la funzionalità da te,  
ed hai (almeno) due strade:
1) Incapsulare l'intero recordset in una classe dotata dei metodi per  
andare avanti e indietro
2) Incapsulare la logica in una classe in modo da eseguire query per  
prendere il record precedente / successivo, magari implementando  
anche un meccanismo di cache.

La prima soluzione è rapida, veloce e semplice, ma ha (sempre almeno)  
due gravi controindicazioni:
- Per recordset molto grandi, mangia un sacco di RAM
- Per tabelle molto "movimentate", rischi di considerare un record  
vecchio, oppure record fantasmi. In definitiva, rischi di non essere  
sincronizzato con il DB.

La seconda soluzione è più flessibile, ma ha come difetto che esegue  
un gran numero di query (una per ogni avanzamento/retrocessione).  
Tramite meccanismi di cache puoi limitare questo problema (ad esempio  
caricare n record prima e dopo il corrente, in modo da averli già  
disponibili, senza dover eseguire una query).
Naturalmente se scegli una strada simile, non devi caricare ogni  
volta tutti i records, ma solo quello/i di cui hai bisogno. Qualcosa  
di simile, supponendo che la PK della tabella sia una column intera  
di nome "id":

class FlexibleRecordSet(object):
     def __init__(self):
         self.current_id = 0

     def get_first(self):
         query = "SELECT * FROM mytable WHERE id = (SELECT MIN(id)  
FROM mytable")
         ... esegui la query, supponendo di avere in row la riga  
risultante ...
         self.current_id = row['id']

     def get_next(self):
         query = "SELECT * FROM mytable WHERE id = (SELECT MIN(id)  
FROM mytable WHERE id > ?)"

Qualcosa del genere, gestendo bene le condizioni di errore, i casi  
limite, ecc, può essere una soluzione flessibile.
Naturalmente ci saranno anche altre vie, tutto sta nel capire qual'è  
la soluzione più adatta nel tuo specifico caso.

Ciao

--
Antonio Valente




Maggiori informazioni sulla lista Python