[Python] next record in mysqldb

Paolo Amodio dixie a dixienet.it
Lun 1 Ott 2007 17:17:23 CEST


Il giorno 01/ott/07, alle ore 15:38, Y3s ha scritto:

>
> 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
>
>
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>

Grazie Antonio, di fatto la mia scelta, come avrai notato, è stata  
una via di mezzo.
Eseguo nuovamente la query per il problema che hai prospettato.
Ho scelto di individuare il recordset successivo (o precedente)  
mediante la fetch (richiamando dalla memoria il precedente ID  
prelevato dal campo nella mia GUI - un textctrl di wxPython).
Questo per far si che la funzione "funzioni" sempre (ad esempio dopo  
aver effettuato una ricerca su un particolare record).
Il problema che, su tabelle discretamente popolate, la velocità non è  
il massimo.
Grazie ancora



Paolo Amodio
dixie a dixienet.it
www.dixienet.it





Maggiori informazioni sulla lista Python