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@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
[EMAIL PROTECTED]
www.dixienet.it
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python