[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