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

Rispondere a